Що б ви хотіли це зробити замість цього? Не бігали 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
скаржиться на те, що цього *
файлу не існує. Ми пригнічуємо rm
stderr, як ви робили, 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
коли глобус не відповідає, неправильно. sh
1 поведінка є неправильним. Це нешкідливо для такого типу візерунка *
, але для такого типу *.[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
скасували б команду, якщо жоден із глобусів не мав відповідності (і придушував би невідповідні глобуси, як мінімум одна з них мала будь-яку відповідність). Поведінка була порушена оболонкою Борна.