Похоже, что это ошибка в bash-4.2
, как обсуждалось здесь, IFS неправильно разбивает строки в bash 4.2 . Должно работать на версиях выше.
Это результаты той же версии, что и у вас - GNU bash, версия 4.2.46 (2). Когда я запустил функцию yyy
в режиме отладки (установив set -x
в командной строке).
++ IFS=:
++ read A B
+++ echo ONE:TWO
++ debug 'A=ONE TWO'
++ echo 'A=ONE TWO'
A=ONE TWO
++ debug B=
++ echo B=
B=
++ echo 'ONE TWO:'
Выше приведен фрагмент выходных данных из режима отладки. Как вы можете видеть, когда echo ONE:TWO
печатается в результате подстановки команды, расщепление слов не ожидается, потому что строка не содержит символов по умолчанию IFS
(пробел / табуляция или символ новой строки)
Таким образом, вы ожидаете, что чтение всей строки с IFS=:
, как ожидается, разделит строку и поместит значения в составляющие переменные A
и B
, но каким-то образом символ :
будет потерян и строка ONE TWO
сохраняется в качестве первого значения переменной.
Посмотрите на результат выполнения функции в GNU bash, версия 4.4.12 (1), которая демонстрирует правильное поведение.
++ IFS=:
++ read A B
+++ echo ONE:TWO
++ debug A=ONE
++ echo A=ONE
A=ONE
++ debug B=TWO
++ echo B=TWO
B=TWO
++ echo ONE:TWO
Было много IFS
связанных ошибок до версии 4.4.0 bash / CHANGES . Поэтому персональная рекомендация - обновить версию bash
до более новой стабильной. Также см. Попытка разбить строку на две переменные
Аналогичная ошибка в версии 4.4.0 (1) -релиз
Можно ожидать, что ONE:TWO
останется неизменным при расширении $(..)
по причинам, упомянутым ранее. Но и здесь символ-разделитель теряется, а переменная A
устанавливается на ONE TWO
IFS=":" read A B <<< $(echo ONE:TWO)
echo "$A"
ONE TWO
Удивительно, но приведенный выше код работает на 4.2.46 (2), что означает 4.4.0 (1). ) сломал функционал, который работал в более ранних выпусках.