与未加引号的here-string一起使用时,为什么此处的“ read”会错误地填充数组?

时间:2018-08-12 23:11:07

标签: bash

我在使用read命令时遇到了一个奇怪的行为,当它们仍旧会进行单词拆分时(在bash的较早版本中),这里的字符串没有用引号引起来。请查看以下片段:

此处echo $lineIFS=:上分割并产生echo a b c-确定

IFS=:
line=a:b:c

echo $line | { read -ra arr; declare -p arr; }

输出:

declare -a arr='([0]="a b c")'

echo $line的结果为echo a:b:c,因为它不包含默认值IFSread中的任何字符,然后在IFS=:上分割并正确地填充了数组- 确定

unset IFS
line=a:b:c

echo $line | { IFS=: read -ra arr; declare -p arr; }

输出:

declare -a arr='([0]="a" [1]="b" [2]="c")'

问题:

unset IFS
line=a:b:c
echo $line # outputs correctly a:b:c

IFS=: read -ra arr <<< $line
declare -p arr

输出:

a:b:c
declare -a arr='([0]="a b c")'

此处<<< $line应该产生<<< a:b:c,因为$line不包含IFS中的任何内容。 read然后应该使用IFS=:正确地填充数组,但是结果只有一个元素,以空格分隔。 为什么?

我使用的是GNU bash, version 4.1.17(1)-release (sparc-sun-solaris2.11),这里的字符串以前经常被单词分割。引用解决了的问题,但是我看不出在这种特殊情况下分词如何使事情变得混乱,因为即使echo $line ...示例也可以正常工作。

GNU bash, version 4.4.19(1)-release (x86_64-pc-linux-gnu)(此处的字符串不再被分割)中,无引号和带引号的版本均能正常工作。

1 个答案:

答案 0 :(得分:1)

这是bash 4.2版(显然是某些4.1.x版)中的一个已知错误,已在4.3版中修复。请参见此bug-bash thread,其中引用了this StackOverflow question@chepner's answer中该问题的错误说明。