Почему нельзя читать переменные заполнения при использовании в конце канала? - PullRequest
4 голосов
/ 18 мая 2010

Почему вывод пуст?

echo "a b c d" | read X Y Z V
echo $X

Я думал, что это будет a.

Ответы [ 3 ]

6 голосов
/ 18 мая 2010

Проблема в том, что для запуска команды read с перенаправлением ввода из echo запускается новый процесс подоболочки. Этот процесс читает значения, присваивает их переменным - и затем завершается; Затем запускается вторая команда echo. Чтобы продемонстрировать это, вы можете сделать второй echo и read из подоболочки:

$ echo "a b c d" | ( read X Y Z V; echo $X )
a
6 голосов
/ 18 мая 2010

В Bash вы можете сделать несколько разных вещей, чтобы сделать это:

А вот строка:

read X Y Z V <<< $(echo "a b c d"); echo $X

Процесс замещения:

read X Y Z V < <(echo "a b c d"); echo $X

А вот документ с подстановкой команд:

read X Y Z V <<EOF
$(echo "a b c d")
EOF
echo $X

Этот метод документа также будет работать с оболочками POSIX в дополнение к Bash.

Если вы читаете из файла, а не из вывода другой команды, это немного проще.

5 голосов
/ 18 мая 2010

Я полагаю, это потому, что echo "a b c d" | read X Y Z V и echo $X являются отдельными утверждениями (я не уверен в точном термине)? Так что один не знает о другом.

РЕДАКТИРОВАТЬ: Дайте echo "a b c d" | ( read X Y Z V; echo $X ) попробовать ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...