Проблема не в самом read
, а в трубе. В bash это заставляет вторую команду (read
, в данном случае ), выполняться в подоболочке. Так что на самом деле он read
превратится в переменную line
, только эта переменная существует в подоболочке и исчезнет, как только конвейер завершится.
(Обратите внимание, что другие оболочки ведут себя по-разному, в частности, ksh запустит последнюю команду конвейера в текущей оболочке, поэтому этот фрагмент кода может работать в ksh. В bash это не сработает, как видите.)
Возможным решением является использование замены процесса <(...)
для первой части конвейера с дополнительным <
для перенаправления на стандартный ввод:
read line < <(printf "%s" "a b")
В данном конкретном случае можно было обойтись без команды printf
, тогда <<<
тоже работало бы:
read line <<<"a b"