Як мовчки дістати порожній рядок із глобального шаблону без відповідності


24

Скажіть, у мене папка з трьома файлами:

foo1
foo2
bar

1. Якщо я біжу

list_of_files=$(print foo*)
echo $list_of_files

Я отримав: foo1 foo2

2. Якщо я біжу

list_of_files=$(print bar*)
echo $list_of_files

Я отримав: bar

3. Однак якщо я біжу

list_of_files=$(print other*)
echo $list_of_files

Я отримую: zsh: no matches found: other*(змінна $list_of_filesпорожня, хоча)


Чи є спосіб попросити zsh не скаржитися, якщо він не може відповідати глобальній експансії?

Моя мета - скористатися вищевказаним механізмом, щоб мовчки зібрати список файлів, які відповідають заданому шаблону глобуса.

Відповіді:


33

Увімкніть null_globопцію для вашого шаблону за допомогою Nкласифікатора глобуса.

list_of_files=(*(N))

Якщо ви робите це для всіх шаблонів сценарію чи функції, увімкніть null_globопцію:

setopt null_glob

Ця відповідь має еквіваленти bash та ksh.

Не використовуйте printта не заміняйте команди! Це створює рядок, що складається з імен файлів з пробілами між ними, а не списком рядків. (Див. Що таке розбиття слів? Чому це важливо в програмуванні оболонок? )


15

Кращий спосіб: for a in *(.N); do ... ; done. Опція N змушує zsh доставити порожній список для, і для буде повторювати нуль разів.

Слідкуйте за ls *.foo(.N); коли ls отримує порожній список аргументів, він перераховує всі файли замість жодного. Ось чому мені не подобається NULL_GLOB (або його еквівалент bash): він змінює всі кулі та легко перериває дзвінки, наприклад, ls.


Можливо, я бачу свою відповідь тут @arnt, це саме те, що мені потрібно було.
gtd

Чому .в (.N)? Інші відповіді мають (N)самі по собі, яка різниця?
Майкл Дорст

Питання стосувалося файлів, і .обмежує глобус відповідати лише файлам.
arnt

4

Я думаю, ви шукаєте NULL_GLOBваріант:

   NULL_GLOB (-G)
          If a pattern for filename generation has no matches, delete  the
          pattern  from  the  argument list instead of reporting an error.
          Overrides NOMATCH.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.