Почему команда чтения в bash работает со строкой здесь, но не с конвейерным выводом? - PullRequest
2 голосов
/ 06 мая 2020

Я пытаюсь понять, как команда bash read работает под капотом. Учитывая, что он ожидает, что его ввод будет поступать со стандартного ввода, я был удивлен, обнаружив, что ввод по конвейеру не работает должным образом. Например,

### Pipe scenario

echo "1 2 3" | read -r one two three
echo "one: $one, two: $two, three: $three"
# output:   'one: , two: , three:' 

### Herestring scenario

read -r one two three <<< "1 2 3"
echo "one: $one, two: $two, three: $three"
# output:   'one: 1, two: 2, three: 3'

Может ли кто-нибудь объяснить, чем принципиально два вышеуказанных способа предоставления ввода отличаются друг от друга (с точки зрения команды чтения)?



EDIT в ответ на комментарии:

Я не хочу знать, «как обойтись без ввода данных через труба », как и связанные вопросы в комментариях. Я знаю, как это сделать (например, я могу использовать здесь строку!).

Мой вопрос: каков основной механизм, который заставляет чтение вести себя по-разному в двух случаях?

1 Ответ

2 голосов
/ 06 мая 2020

read работает, но вам нужно запросить значения в той же подоболочке:

echo "1 2 3" | (read -r one two three && echo "one: $one, two: $two, three: $three")

Альтернативой является

read -r one two three < <( echo "1 2 3")
...