我想根据 .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
默认情况下,zsh
shell 会将不匹配的文件名通配模式视为致命错误。如果您期望 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
与设置的效果相同dotglob
。bash
除了迭代匹配的名称并使用测试来测试每个名称之外,点没有任何等价性-f
。
末尾:t
的$profile
是“tail”的缩写,将为您提供变量中路径名的基本名称。