让我们从一个简单的文件名生成示例开始:
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 的效果?
只需使用:
请注意命令替换周围的引号和
zsh
执行单词拆分一样,如果在命令替换时默认情况下没有通配,这可以在以下情况中派上用场:加入 with 的输出中的单词
cmd
并将|
其解释为一个 glob。b
如果您不希望这些词本身被视为模式,另请参阅参数扩展标志: