You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:49:30