我如何处理鱼的 null_glob 结果?

mat*_*mc3 4 fish

我有一个包含以下rm语句的 fish 函数:

rm ~/path/to/dir/*.log
Run Code Online (Sandbox Code Playgroud)

如果该路径中有 *.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
Run Code Online (Sandbox Code Playgroud)

ZSH 有所谓的Glob Qualifiers。其中之一N,处理为当前模式设置 NULL_GLOB 选项,这基本上满足我的要求:

如果文件名生成的模式没有匹配项,则从参数列表中删除该模式而不是报告错误。

我知道 fish 没有ZSH-style glob qualifiers,但我不清楚如何在我的 fish 函数中处理这种情况。我应该遍历数组吗?看起来真的很冗长。或者有没有更可疑的方法来处理这种情况?

# A one-liner in ZSH becomes this in fish?
set -l arr ~/path/to/dir/*.log
for f in $arr
    rm $f
end
Run Code Online (Sandbox Code Playgroud)

rid*_*ish 6

鱼不支持丰富的水珠,但是countsetfor是特殊的,因为它们了nullglob。所以你可以写:

set files ~/path/to/dir/*.log; rm -f $files
Run Code Online (Sandbox Code Playgroud)

(这-f是必需的,因为rm如果您传递零参数会抱怨。)

count 也可以工作:

count ~/path/to/dir/*.log >/dev/null && rm ~/path/to/dir/*.log
Run Code Online (Sandbox Code Playgroud)

为了完整起见,循环:

for file in ~/path/to/dir/*.log ; rm $file; end
Run Code Online (Sandbox Code Playgroud)