Я не могу воспроизвести вашу проблему в Linux с помощью bash 4.2.46 и bash 4.3.30. Однако, здесь адаптированная версия, которая действительно показывает, описанное поведение:
string="one:two:three:four"
IFS=:
read -ra array_1 <<< $string
for i in "${array_1[@]}"; do printf "i = [$i]\n"; done
# i = [one two three four]
read -ra array_2 <<< "$string"
for i in "${array_2[@]}"; do printf "i = [$i]\n"; done
# i = [one]
# i = [two]
# i = [three]
# i = [four]
Это происходит потому, что переменные не фактически разделить на пространствах, они разделены на $IFS
(который по умолчанию пробела, табуляции и перевода строки).
Поскольку мы переопределили $IFS
, это значения с двоеточиями, мы должны быть осторожны при цитировании. Пространства больше не имеют значения.
Исходный код показывает, что Bash hardcodes a space в string_list
, вызванный через write_here_string. Когда IFS
не содержит пробела, строка, которая расширяется до нескольких слов, больше не будет read
в токенах вдоль аналогичных строк, делая разницу более выраженной.
PS: Это хороший пример того, почему мы всегда должны указывать наши переменные, даже если мы знаем, что они содержат.
Это действительно ошибка, которая частично была рассмотрена в 4.3 и завершена (?) В 4.4. – chepner