Хто займається (тлумачить) * в
echo *
Чи бачить відлуння зірка чи оболонка про це і повертає список імені файлу ..
Що стосовно
cp temp temp*
Хто займається (тлумачить) * в
echo *
Чи бачить відлуння зірка чи оболонка про це і повертає список імені файлу ..
Що стосовно
cp temp temp*
Відповіді:
bash (або все, що ви використовуєте як оболонку) - це перше, що потрібно прочитати будь-який вхід, і почне інтерпретувати спеціальні символи, такі як ?
і *
. *
розширюється до будь-яких збігів у CWD , що означає, що зірочка заміщена зазначеними збігами.
У більшості випадків це досить непомітно, але час від часу може призводити до деяких заплутаних випадків.
Розглянемо наступне. Каталог містить цей вміст:
Якщо ви введете mv *
щось, здавалося б, дивне трапляється: test3
є, але решта вже немає. У той час як спочатку дивно, це має сенс, як тільки ти зрозумієш, до чого насправді переходить баш mv
. Через зірочку bash інтерпретує mv *
як mv test test1 test2 test3
, і коли mv потрапить до цього списку, ви вважатимете, що остання аргументація - це пункт призначення, куди було б переміщено всі файли.
Щодо перерахованих вами команд:
echo *
може функціонувати як бідняки ls
. Оболонка розширить зірочку на все, що є в цьому каталозі, і, як я впевнений, ви вже знаєте, echo
буквально просто відлучить все, що баш передається йому як аргументи.cp temp temp*
буде поводитися дещо як mv
команда, яку я описав вище, якщо тільки є одна директорія з ім'ям temp, у цьому випадку джерело та ім'я призначення є однаковим, тобто вона нічого не зробить.*
замість цього немає нічого поганого ls
. Наприклад, for f in *; do
є більш надійним, ніж for f in $(ls)
якщо ім'я файлу містить пробіл або символ глобуса. (Однак, це не вдасться, якщо в CWD немає файлів, тому вам потрібно перевірити цей випадок.)
shopt nullglob
.
echo *
, цей трюк може врятувати вас у деяких випадках.
Як уже було сказано, оболонка розширюється, *
тому echo
отримуйте як аргументи те, що оболонка знайдеться в поточному каталозі. Однак зауважте, що якщо розширення не призводить до нічого, тобто в тому випадку, якщо каталог не містить не прихованих файлів,*
залишок залишається незмінним і передається так само, як і в команді, що називається (якщо не використовуються нестандартні параметри з деякими оболонками, як bash
.) echo *
не буде тоді вести себе як бідняк, ls
оскільки перший нічого не друкує, а другий друкує *
.
Аналогічно cp /tmp/temp temp*
створить файл, названий temp*
у поточному каталозі, якщо ще немає хоча б одного файлу, з якого починається ім'я temp
.
Нарешті, якщо ви хочете, *
щоб у будь-якому випадку це було прийнято незмінним, ви можете захистити його від розширення, використовуючи або окремі лапки '*'
, подвійні лапки "*"
або звороту косу рису \*
.
У Bash оболонка займається цим. Ви це бачите, якщо навіть спробуєте*
без ехо
Примітка. На основі деяких коментарів я б запропонував під час запуску * ENTER створити каталог і використовувати команду touch для створення деяких файлів і переконайтесь, що жоден з них, або принаймні переконайтеся, що перший алфавіт не є ім'ям будь-якого сценарію або команди на шляху.
$ *
bash: a: command not found
$ echo *
a a.aa a.ab a.b a.htm a.tx
Так ls *
це трохи кліше
У Windows *
обробляється командою, такdir *.*
це не кліше.
Примітка. Я додаю, що побачивши деякі коментарі, існує ризик запуску *, а потім УВІДКА. Якщо у вас є файл з назвою rm, який є першим у списку каталогів, то це небезпечно, оскільки все після нього буде видалено. Крім того, і це менш малоймовірно, якщо перший файл у списку каталогів - це ім'я скрипту на шляху, то він запустить це.
rm
.
-rf
? Я спробував touch -rf
і , touch \-rf
але це не створює його.
-rf
? (Я розумію небезпеку файлу під назвою rm та файлу під назвою -rf, і проблема введення * та натискання клавіш увійти у важливу папку, я цього не збираюся робити)
Оболонка виконує кілька розширень, перш ніж аргументи будуть передані команді.
Дивіться також https://www.gnu.org/software/bash/manual/bashref.html#Simple-Command-Expansion
Не специфічно для bash, див. Http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_01