使用命令替换生成全局模式的嵌套部分

使用命令替换生成全局模式的嵌套部分

让我们从一个简单的文件名生成示例开始:

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

相关内容