为什么此处字符串命令替换被视为单行?

为什么此处字符串命令替换被视为单行?

我正在尝试while read句法有件事我不明白。

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

a.sh

#!/bin/bash

while read line; do
    echo "<<$line>>"
done <<< `./b.sh`

b.sh

#!/bin/bash

echo "Hello"
echo "World"

运行b.sh给出了预期的结果:

Hello
World

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

<<Hello World>>

虽然我期望它是:

<<Hello>>
<<World>>

我究竟做错了什么?

答案1

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

[...]

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

[...]

z。 正如文档一直所说的那样,Bash 不再拆分此处字符串的扩展。

这对我来说有点含糊不清,但无论bash当时对源代码所做的任何更改都会产生这样的效果:在 Bash 4.4 中,命令

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

将产生

<<hello>>
<<world>>

不是

<<hello world>>

如 Bash 4.3 中所示。

相关内容