read<<<<<<<< $(myfunc)行为在bash 4.2和4.4

时间:2017-09-10 16:34:47

标签: bash

我在下面有一些代码从列表中读取数组

#!/usr/local/bin/bash

function getlist {
    printf "%q/\n" "foo"
    printf "%q/\n" "bar"
}

IFS="$(printf ' \n\t')"
# IFS=" "

while read -r tmp; do
    echo "test"
    echo $tmp
done <<< $(getlist)

4.2 bash输出

$ ./test.sh
test
foo/ bar/

4.4输出

$ ./test.sh
test
foo/
test
bar/

但是,如果我改变IFS =“”,它们的行为与4.4相同(但实际上分隔符是\ n,对吧?)。不知道这两个版本之间有什么变化

1 个答案:

答案 0 :(得分:4)

问题不在于read,而是你没有引用herestring。如果你引用它,你会得到4.4结果:

#!/usr/local/bin/bash

function getlist {
    printf "%q/\n" "foo"
    printf "%q/\n" "bar"
}

IFS="$(printf ' \n\t')"
# IFS=" "

while read -r tmp; do
    echo "test"
    echo $tmp
done <<< "$(getlist)"

它在bash 4.4中有所不同,因为它修复了与in the release notes中找到的文档的偏差:

  

ž。 Bash不再拆分here-strings的扩展,正如文档总是说的那样。