Zsh中进程替换结合HereDoc的用法如何在Bash/Sh中实现?
原因分析与解决方法
为什么Zsh可行但Bash/Sh不行
- Zsh的进程替换实现允许
source直接加载并执行进程替换生成的临时文件描述符中的脚本内容,因此你的原始写法可以正常运行。 - 在POSIX标准Sh(如dash)中,进程替换
<(...)属于非标准扩展,根本不被支持,你的写法会触发语法错误,但部分shell的容错逻辑可能让source默认返回成功,导致直接输出ok。 - 在部分Bash版本或环境中,直接将HereDoc通过
<(...)传递给source会因解析优先级问题,导致source未能正确读取HereDoc内的脚本,从而跳过执行直接返回成功。
Bash/Sh兼容的实现方法
方法1:POSIX标准写法(兼容所有Sh和Bash)
使用source -指定从标准输入读取脚本内容,结合HereDoc实现需求:
source - <<'heredoc' echo foo sleep 10 echo done heredoc && echo ok || echo no
-是source的标准参数,表示读取标准输入;<<'heredoc'用单引号包裹分界符,避免HereDoc内的变量、命令被shell提前解析,和你原始逻辑一致。
方法2:Bash专属写法(利用进程替换)
如果仅针对Bash,可显式用cat将HereDoc内容输出到进程替换的文件描述符,确保source能正确读取:
source <(cat <<'heredoc' echo foo sleep 10 echo done heredoc) && echo ok || echo no
内容的提问来源于stack exchange,提问作者Danilo Pianini
相关产品推荐
相关产品推荐

