为什么 here-string 命令替换被视为单行?

Ars*_*nko 4 bash io-redirection quoting command-substitution

我正在尝试while read语法,但有一点我不明白。

重现该问题的最基本场景如下:一个 bash 脚本a.sh调用另一个脚本b.sh并显示由它回显的行:

a.sh

#!/bin/bash

while read line; do
    echo "<<$line>>"
done <<< `./b.sh`
Run Code Online (Sandbox Code Playgroud)

b.sh

#!/bin/bash

echo "Hello"
echo "World"
Run Code Online (Sandbox Code Playgroud)

运行b.sh按预期给出:

#!/bin/bash

while read line; do
    echo "<<$line>>"
done <<< `./b.sh`
Run Code Online (Sandbox Code Playgroud)

另一方面,当我运行时a.sh,输出是:

#!/bin/bash

echo "Hello"
echo "World"
Run Code Online (Sandbox Code Playgroud)

虽然我希望它是:

Hello
World
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Kus*_*nda 5

来自4.4-alpha 和 4.4-beta 之间的 Bash 变更日志

[...]

本文档详细介绍了此版本 bash-4.4-beta 与先前版本 bash-4.4-alpha 之间的更改。

[...]

z。 Bash 不再拆分 here-strings 的扩展,正如文档中一直所说的那样。

这对我来说有点含糊不清,但是当时提交给bash源的任何更改都会产生影响,即在 Bash 4.4 中,命令

while read line; do
    printf '<<%s>>\n' "$line"
done <<< $( printf '%s\n' hello world )
Run Code Online (Sandbox Code Playgroud)

会产生

<<hello>>
<<world>>
Run Code Online (Sandbox Code Playgroud)

不是

<<hello world>>
Run Code Online (Sandbox Code Playgroud)

就像在 Bash 4.3 中一样。