让我们从一个简单的文件名生成示例开始:
echo (xx|yy|zz)*.txt # Example 1
这列出了所有以 xx 或 yy 或 zz 开头的 txt 文件。现在让我们使用命令替换动态生成这些替代方案;我echo
在这里只是为了说明我要去的地方;在“现实世界”的例子中,这当然是一些程序:
echo $(echo '(xx|yy|zz)')*.txt # Example 2
这会像上面一样工作。现在是棘手的部分:命令替换应该只提供替代列表的一部分:
echo ($(echo 'xx|yy')|zz)*.txt # Example 3 (does not work)
这不再有效:它将找到以 zz 开头的文件,但找不到以 yy 开头的文件。我猜 Zsh 正在搜索从xx|yy
这里开始的文件。
如果我们使用辅助变量,我们就可以让它工作:
list=$(echo 'xx|yy')
echo (${~list}|zz)*.txt # Example 4
现在回答我的问题:
不使用临时变量是否可以达到例4的效果?
答案1
只需使用:
echo (${~"$(echo 'xx|yy')"}|zz)*.txt
请注意命令替换周围的引号,就像zsh
执行分词一样,如果在命令替换时默认不进行通配,这在以下情况下会很方便:
echo (${~${(j:|:)$(cmd)}}).txt
cmd
连接with输出中的单词|
并将其解释为一个 glob。b
如果您不希望这些单词本身被视为模式,另请参阅参数扩展标志:
echo (${~${(j:|:)${(b)$(cmd)}}}).txt