Що б ви хотіли це зробити замість цього? Не бігали rmвзагалі (1)? Виконати це з буквальним *аргументом, як в інших оболонках Борна (2)? Запустити його без аргументів (3)?
files=(*(N)); (($#files)) && rm -- $files. Або (rm -- *) 2> /dev/nullале це також приховувало б справжні помилки, через rmякі було б нерозумно. Ви можете відкинути zshпомилку, але відновити stderr для rmкоманди, хоча з(rm -- * 2>&3 3>&-) 3>&2 2> /dev/null
emulate sh -c 'rm -- *' 2> /dev/null. Тоді, як, в shякому zshзараз емульовано для цього єдиного командного рядка, невідповідний *передається як є rmі rmскаржиться на те, що цього *файлу не існує. Ми пригнічуємо rmstderr, як ви робили, shщоб придушити це повідомлення про помилку, але, знову ж таки, це нерозумно, як це приховувало б справжні помилки, на rmвідміну від помилки, що трапилася внаслідок неправильної поведінки при shпередачі літералу *на rm. rm -f '*'не поскаржився б на неіснуючий *файл, тож ви можете це зробитиemulate sh -c 'rm -f -- *'
rm -- *(N). rmбуде скаржитися , хоча , коли він не пропустив жодного одного аргументу, хоча знову ж , чи не rm -f: rm -f -- *(N).
Як правило, rm -fце команда, яку ви хочете використовувати, якщо ви хочете, щоб усі файли пішли і отримали помилку лише в тому випадку, якщо файли не вдалося видалити або IOW все ще є після rmповернення. Ви також хочете використовувати -fв сценаріях, щоб уникнути того, що користувач буде запропонований в деяких ситуаціях.
Тут дзвонити, rmколи глобус не відповідає, неправильно. sh1 поведінка є неправильним. Це нешкідливо для такого типу візерунка *, але для такого типу *.[ch], передача *.[ch]як є, коли вона не відповідає, може призвести *.[ch]до помилкового видалення файлу:
$ ls
*.[ch] foo.txt
$ zsh -c 'rm *.[ch]'
zsh:1: no matches found: *.[ch]
$ ls
*.[ch] foo.txt
$ sh -c 'rm *.[ch]'
$ ls
foo.txt
В іншому випадку з помилкою найрозумніше , що потрібно зробити , і це те , що zsh(і fish, csh, tcsh, bash -o failglobі оригінальний Unix оболонки) робить.
А якщо ви хочете подбати про той особливий випадок, zshце полегшує роботу з його (N)глобальним класифікатором (для ноглобу ), як у випадку (1) вище. fish(принаймні, в останній версії ) це робить ще простіше, оскільки це робить неявний ноглоб для setкоманди. Отже, еквівалент там буде:
set files *
if count $files > /dev/null
rm -f -- $files
end
Дивіться, чому nullglob не використовується за замовчуванням для отримання детальної інформації.
1 . Власне кажучи, це лише shз оболонки Bourne (починаючи з Unix V7 в 1979 році); більш ранні версії sh(які закликали /etc/globкотирувати подстановочні символи, звідки походить ім'я глобуса ) поводилися так, cshабо zsh -o cshnullglob, тобто, /etc/globскасували б команду, якщо жоден із глобусів не мав відповідності (і придушував би невідповідні глобуси, як мінімум одна з них мала будь-яку відповідність). Поведінка була порушена оболонкою Борна.