在 zsh 中可以使用heredoc进行进程替换。如何让它在 bash 中工作?

问题描述 投票:0回答:2

我希望能够将定界符传递给

source
命令进行本地解释。 Heredoc 文档的正文将在稍后调用脚本之前注入,并且可以是多行的。

我想出了这个技巧,它适用于

zsh

source <(<<'heredoc'
echo foo
sleep 10
echo done
heredoc
) && echo ok || echo no

它打印

foo
,休眠 10 秒,然后打印
done
,然后打印
ok
。到目前为止,一切都很好。

现在,脚本需要在

bash
中运行。 当我喂
bash
(或
sh
)完全相同的东西时,我只得到
ok
,根本不需要等待,就好像我向定界文档提供的命令只是
true

我不明白为什么,以及如何在

bash
sh
中构建相同的行为。

bash sh zsh heredoc process-substitution
2个回答
0
投票
source <(cat <<'heredoc'
echo foo
sleep 10
echo done
heredoc
) && echo ok || echo no

0
投票

如何让它在bash中工作?

删除此处的所有文档并执行命令。您可以保留该组。

{
   echo foo
   sleep 10
   echo done
} && echo ok || echo no

如果您想在当前执行环境中执行来自 steam 的命令(例如此处的文档),则可以在 zsh 和 bash 中使用

source /dev/stdin
。在任何一种情况下都不需要
<(
流程替换。

为什么

因为在 bash 中,空重定向(例如没有命令的此处文档)不会执行任何操作。例如,您必须将此处文档创建的流的内容输出到标准输出,以便过程变电站捕获它。

    

© www.soinside.com 2019 - 2024. All rights reserved.