循环查找目录中的每个文件,但在不存在文件时不会抛出错误

循环查找目录中的每个文件,但在不存在文件时不会抛出错误

我想根据 .profiles/ 目录中的文件加载别名。

for profile in ~/.profiles/*; do
    for file in ~/.s1n7ax/$(basename $profile)/alias/*; do
        include "$file"
    done
done

但是,当里面没有任何文件时,~/.s1n7ax/$(basename $profile)/alias/*它会抛出错误。

/home/s1n7ax/.zshrc:117: no matches found: /home/s1n7ax/.s1n7ax/work/alias/*

我想优雅地处理这个问题,而不向 SDT 输出错误。

答案1

默认情况下,zshshell 会将不匹配的文件名通配模式视为致命错误。如果您期望 glob 不匹配任何内容,那么您可以使用 globbing 限定符将模式扩展为没有什么而不是失败:

for profile in ~/.profiles/*(.N); do
    for file in ~/.s1n7ax/$profile:t/alias/*(.N); do
        include $file
    done
done

N这里,如果没有匹配的文件名,括号中的尾部将使模式完全消失,从而导致跳过相应的循环。点是另一个仅选择常规文件的限定符。您还想匹配吗名称,您应该添加D到限定符列表中。

限定符N对模式的影响与在 shellnullglob中设置 shell 选项时的效果相同bash,并且D与设置的效果相同dotglobbash除了迭代匹配的名称并使用测试来测试每个名称之外,点没有任何等价性-f

末尾:t$profile是“tail”的缩写,将为您提供变量中路径名的基本名称。

相关内容