Как мне обработать результаты null_glob в рыбе? - PullRequest
2 голосов
/ 06 ноября 2019

У меня есть функция fish, которая содержит следующий оператор rm:

rm ~/path/to/dir/*.log

Этот оператор работает нормально, если в этом пути есть файлы * .log, но не работает, если нет * .logфайлы. Ошибка:

~/.config/fish/functions/myfunc.fish (line 5): No matches for wildcard '~/path/to/dir/*.log'. See `help expand`.
    rm ~/path/to/dir/*.log
       ^
in function 'myfunc'
        called on standard input

ZSH имеет то, что называется Glob Qualifiers . Один из них, N, обрабатывает установку опции NULL_GLOB для текущего шаблона, что по сути делает то, что я хочу:

Если шаблон для генерации имени файла не имеет совпадений, удалите шаблон из аргументасписок вместо сообщения об ошибке.

Я понимаю, что у рыбы нет квалификаторов глобуса в стиле ZSH , но мне неясно, как обрабатывать этот сценарий в моих функциях рыбы. Должен ли я цикл через массив? Это кажется действительно многословным. Или есть более подозрительный способ справиться с этим сценарием?

# A one-liner in ZSH becomes this in fish?
set -l arr ~/path/to/dir/*.log
for f in $arr
    rm $f
end

1 Ответ

4 голосов
/ 06 ноября 2019

fish не поддерживает богатые глобусы, , но count, set и for являются специальными в том смысле, что они являются нуль-глобусами. Таким образом, вы можете написать:

set files ~/path/to/dir/*.log; rm -f $files

(-f требуется, потому что rm жалуется, если вы передаете ему ноль аргументов.)

count также может работать:

count ~/path/to/dir/*.log >/dev/null && rm ~/path/to/dir/*.log

Для полноты, цикл:

for file in ~/path/to/dir/*.log ; rm $file; end
...