如何在ZSH参数中间使用=(list)式进程替换?
在ZSH参数中间使用=(list)进程替换的解决方案
咱先复盘下你遇到的问题:
- 当
=(list)在参数开头时,完全正常:
甚至后面加后缀也没问题:% echo =(echo) /tmp/zshxxxxxx% echo =(echo):works /tmp/zshxxxxxx:works - 但把它放在参数中间就直接报错:
% echo broken:=(echo) zsh: missing end of string - 对比之下,
<(list)就没这个限制:% echo works:<(echo) works:/proc/self/fd/11
核心原因正如ZSH手册所说:
表达式前后可附带其他字符串,但为避免与常见字符串和模式冲突,最后一种形式[即=(list)]必须位于命令参数的开头,且仅在首次解析命令或赋值参数时展开。
而你需要给工具传format:filename格式的参数,还必须用真实文件(没法用管道类的<(list)),下面给你两个简洁易读的解决办法:
方案1:用变量提前存储临时文件名
把=(list)的结果先存到变量里,再拼接成需要的格式,可读性拉满:
# 生成临时文件并保存文件名 temp_file=(=(echo "你需要的内容")) # 传给工具 your_tool "format:$temp_file"
不用担心临时文件清理的问题,ZSH会自动在shell会话结束时删除这些临时文件;如果需要立即清理,执行rm $temp_file即可。
方案2:用参数展开直接拼接
如果想写成单行,用ZSH的参数展开语法把=(list)包起来,就能在参数中间正常展开了:
your_tool "format:${(=(echo "你需要的内容"))}"
这里的大括号会让ZSH优先展开内部的=(list)得到临时文件名,再和前面的format:拼接成完整参数。
内容的提问来源于stack exchange,提问作者Balint Laczay
相关产品推荐
相关产品推荐

