Яка функція зірочки як окремої команди в Unix?


21

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

Моя найкраща здогадка полягає в тому, що Unix розглядав це як підстановку, тому він виконав першу алфавітну програму. Оскільки my_program.exeі one_of_my_programs.programможе бути виконаний, просто набравши ім'я файлу, оператор wildcard представляє всі можливі файли. Оскільки програма спочатку в алфавітному порядку, Unix виконує її. Це правильне судження?


Я думаю, що не всі оболонки сортують розширення в *алфавітному порядку, але bash - це те, що потрібно.
aschepler

1
@aschepler: всі оболонки, що відповідають POSIX, повинні бути; дивіться pubs.opengroup.org/onlinepubs/9699919799/utilities/… пункт 3.
dave_thompson_085

Відповіді:


20

Ваше тлумачення правильне. Решта файлів буде представлена ​​як його список параметрів.

Зауважте, що це буде зроблено лише в тому випадку, якщо в програмі встановлений виконуваний біт і поточний каталог знаходиться в 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параметри, або перевіряє параметри і просить підтвердити, чи є їх більше ніж певне число.
АФХ

3
+1 для "Ось одне з найжахливіших повідомлень, яке коли-небудь читалося".
Мехрдад

+1 за "Це дійсно погана ідея з міркувань безпеки (природно, Windows повинна була зробити її незмінним за замовчуванням)."
Дункан X Сімпсон


Є вагома причина, чому Windows зробила це незмінним за замовчуванням. Він повинен підтримувати ланцюг зворотної сумісності за дні, перш ніж DOS впровадив каталоги. Майте на увазі, що в ті дні ніхто не користувався ПК жорстким диском, а дискети були досить маленькими, що каталоги спочатку не вважалися необхідними.
Мюзер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.