【问题标题】:Why source command doesn't work with process substitution in bash 3.2?为什么 source 命令不适用于 bash 3.2 中的进程替换?
【发布时间】:2015-12-12 07:17:15
【问题描述】:

我有以下 shell 脚本:

cat <(echo foo)
source <(echo bar=bar)
echo $bar

但是它在 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

为什么这只适用于一个版本?是错误还是新增功能?

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

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

【问题讨论】:

标签: bash syntax incompatibility process-substitution


【解决方案1】:

这是known limitation in bash 3.2。要解决它:

source /dev/stdin <<<"$(echo bar=bar)"

...或者,类似地:

source /dev/stdin <<<"$(cat <(...))"

【讨论】:

  • eval 的行为并不完全相同;例如,查看顶级 return 语义,或用于堆栈跟踪报告的各种数组。
  • 太棒了!这也适用于curlsource /dev/stdin &lt;&lt;&lt;"$( curl $url )"
  • 这个限制在 GNU bash 4.4.19(1) 中仍然存在。
  • @ChadSkeeters,我不相信这是真的。确定你不在一个平台上,比如 msys2 Windows 构建,有损坏的进程替换?在ideone.com/amkRVh 看到它在 bash 5 上运行良好;如果我可以链接到在线 4.x 沙盒,我也会这样做,但我知道的只是 IRC 与基于 Web 的沙盒。
  • @CharlesDuffy 我在 MacOS 10.15.4 上使用 brew 的 bash 4.4.19(1)。进程替换对我不起作用。
猜你喜欢
  • 2023-03-22
  • 2015-05-09
  • 2014-05-07
  • 1970-01-01
  • 2012-11-20
  • 2012-08-11
  • 1970-01-01
  • 2016-07-17
  • 1970-01-01
相关资源
最近更新 更多