Хто займається (тлумачить) * в
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