为什么源命令不适用于bash 3.2中的进程替换?

ken*_*orb 8 syntax bash incompatibility process-substitution

我有以下shell脚本:

cat <(echo foo)
source <(echo bar=bar)
echo $bar
Run Code Online (Sandbox Code Playgroud)

但是它在GNU bash 3.2和4.3中的工作方式不同,如下所示:

$ /bin/bash foo.sh 
foo

3.2.53(1)-release

$ /usr/local/bin/bash foo.sh 
foo
bar
4.3.33(1)-release
Run Code Online (Sandbox Code Playgroud)

为什么这只适用于一个版本?是bug还是添加功能?

似乎流程替换工作正常,但是在获取文件时存在问题.

如果这是预期的行为,我应该使用什么其他语法来代替source标准输入中的某些东西,以便在不同的bash版本之间兼容?

Cha*_*ffy 14

这是bash 3.2中已知限制.要解决它:

source /dev/stdin <<<"$(echo bar=bar)"
Run Code Online (Sandbox Code Playgroud)

......或类似地:

source /dev/stdin <<<"$(cat <(...))"
Run Code Online (Sandbox Code Playgroud)

  • 一个更清洁的解决方法是`eval“ $(echo bar = bar)”` (2认同)