Я возился в терминале на Red Hat Linux, и когда я набрал звездочку ( *
), а затем return, она запустила одну из программ в моем каталоге. Зачем?
Мое предположение заключается в том, что Unix воспринимал это как шаблон, поэтому он выполнил первую алфавитную программу. Так как my_program.exe
и one_of_my_programs.program
может быть выполнено простым вводом имени файла, оператор подстановки представляет все возможные файлы. Поскольку программа сначала в алфавитном порядке, Unix выполняет ее. Это правильное суждение?
linux
command-line
bash
unix
user6086585
источник
источник
set -x
затем выполните свою команду (*
), вы увидите, что оболочка на самом деле решает выполнить с каждой командой после любых подстановок. (выключите этот режим с помощьюset +x
)*
алфавиту, но bash это то, что делает.Ответы:
Ваша интерпретация верна. Остальные файлы будут представлены в виде списка параметров.
Обратите внимание, что это будет сделано только в том случае, если в программе установлен исполняемый бит и текущий каталог находится в
PATH
списке.Несколько замечаний, которые могут помочь понять:
./*
тоPATH
запись не является обязательным требованием.. *
или,. ./*
и первый соответствующий файл является сценарием, то он не должен быть исполняемым, а также не должен находиться в текущем каталогеPATH
(может быть неверным для оболочек, отличных отbash
).источник
PATH
с тем же именем, что и у первого файла, то эта другая команда будет выполнена.mkdir foo; cd foo; touch rm xyz; ls; *; ls
,*
является псевдонимом.. *
или. ./*
можноbash *
(или любой другой оболочки).Это говорит о том, что
.
является частью вашейPATH
переменной. Это очень плохая идея по соображениям безопасности (естественно, Windows пришлось сделать его неизменяемым по умолчанию).Тем не менее, это «предложение» является лишь умеренно допустимым: если у вас есть файл с именем
rm
в текущем каталоге,*
будет хорошо выполнить значение по умолчаниюrm
:Как вы можете видеть, он
rm
выполнялся не в текущем каталоге (пустой и неисполняемый файл), а по умолчанию в системе/bin/rm
.Всегда перепроверяйте свои команды, когда используются подстановочные знаки. Вот одно из самых страшных сообщений, которое когда-либо читалось:
Это результат звонка
более или менее худшее расположение ложного пространства, которое можно придумать.
источник
rm()
которая либо добавляет-i
параметры, либо проверяет параметры и запрашивает подтверждение, если их больше определенного числа.mv /tmp/ohno /tmp/ohnoes
( google.fr/search?q=ohnoes&source=lnms&tbm=isch )