Какова функция звездочки как отдельной команды в Unix?


21

Я возился в терминале на Red Hat Linux, и когда я набрал звездочку ( *), а затем return, она запустила одну из программ в моем каталоге. Зачем?

Мое предположение заключается в том, что Unix воспринимал это как шаблон, поэтому он выполнил первую алфавитную программу. Так как my_program.exeи one_of_my_programs.programможет быть выполнено простым вводом имени файла, оператор подстановки представляет все возможные файлы. Поскольку программа сначала в алфавитном порядке, Unix выполняет ее. Это правильное суждение?


2
К вашему сведению, если вы set -xзатем выполните свою команду ( *), вы увидите, что оболочка на самом деле решает выполнить с каждой командой после любых подстановок. (выключите этот режим с помощью set +x)
drewbenn

Я думаю, что не все оболочки сортируют расширение по *алфавиту, но bash это то, что делает.
aschepler

1
@aschepler: все POSIX-совместимые оболочки должны; см. pubs.opengroup.org/onlinepubs/9699919799/utilities/… пункт 3.
dave_thompson_085

Ответы:


21

Ваша интерпретация верна. Остальные файлы будут представлены в виде списка параметров.

Обратите внимание, что это будет сделано только в том случае, если в программе установлен исполняемый бит и текущий каталог находится в PATHсписке.

Несколько замечаний, которые могут помочь понять:

  • Если вы печатаете, ./*то PATHзапись не является обязательным требованием.
  • Если вы вводите . *или, . ./*и первый соответствующий файл является сценарием, то он не должен быть исполняемым, а также не должен находиться в текущем каталоге PATH(может быть неверным для оболочек, отличных от bash).

10
«Это будет делать только…» - может быть интереснее. Если ранее есть функция оболочки, встроенная или исполняемый файл PATHс тем же именем, что и у первого файла, то эта другая команда будет выполнена. mkdir foo; cd foo; touch rm xyz; ls; *; ls,
Камиль Мачоровский

@KamilMaciorowski - Справедливо: мое заявление «он сделает это только…» определило необходимые условия, но не достаточные . Команда также будет вести себя иначе, если *является псевдонимом.
AFH

1
Вывод: не делай этого! Даже если вы думаете, что можете полагаться на алфавитный порядок расширения глобуса, учтите, что этот порядок зависит от локали.
Аарон

в дополнение к . *или . ./*можно bash *(или любой другой оболочки).
Оливье Дюлак

11

Это говорит о том, что .является частью вашей PATHпеременной. Это очень плохая идея по соображениям безопасности (естественно, Windows пришлось сделать его неизменяемым по умолчанию).

Тем не менее, это «предложение» является лишь умеренно допустимым: если у вас есть файл с именем rmв текущем каталоге, *будет хорошо выполнить значение по умолчаниюrm :

/tmp$ mkdir ohno
/tmp$ cd ohno
/tmp/ohno$ 
/tmp/ohno$ ls
/tmp/ohno$ touch rm what
/tmp/ohno$ ls
rm  what
/tmp/ohno$ *
/tmp/ohno$ ls
rm
/tmp/ohno$ 

Как вы можете видеть, он rmвыполнялся не в текущем каталоге (пустой и неисполняемый файл), а по умолчанию в системе /bin/rm.

Всегда перепроверяйте свои команды, когда используются подстановочные знаки. Вот одно из самых страшных сообщений, которое когда-либо читалось:

rm: cannot remove '.o': No such file or directory

Это результат звонка

rm * .o

более или менее худшее расположение ложного пространства, которое можно придумать.


1
Не мешало бы создать функцию, rm()которая либо добавляет -iпараметры, либо проверяет параметры и запрашивает подтверждение, если их больше определенного числа.
AFH

3
+1 за «Вот одно из самых страшных сообщений, которое когда-либо читали».
Мердад

+1 за «Это действительно плохая идея по соображениям безопасности (естественно, Windows пришлось сделать это неизменяемым по умолчанию)».
Дункан Х Симпсон


Есть веская причина, по которой Windows сделала его неизменным по умолчанию. Он должен поддерживать цепочку обратной совместимости со времен до того, как DOS внедрил каталоги. Имейте в виду, что в те дни ни у кого не было компьютера, у которого был жесткий диск, а дискеты были достаточно маленькими, поэтому каталоги изначально не считались необходимыми.
Музер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.