Как ввод завершается во время конвейера, хотя перевод строки не используется?

Расширяя решение Смита Джона , это дает хороший псевдоним в вашем.bash_profile:

alias MyPath='echo -e ${PATH//:/\\n}'

0
20.04.2020, 14:07
1 ответ

Если вы исследуете статус выхода -этого конвейера, вы заметите, что readвозвращает 1:

$ echo -n "Hello" | read
$ echo $?
1

Он возвращает 1, так как обнаружил конец -из условия -файла и, следовательно, не смог прочитать больше данных. Входной поток из echoбыл закрыт, потому что echoзавершил свою задачу и завершился, закрыв эту сторону канала.

Данные, считанные до закрытия входного потока из echo, по-прежнему будут доступны в переменной REPLY:

$ echo -n "Hello" | { read; echo "$REPLY"; }
Hello

Короче говоря, readне ожидает дальнейшего ввода, поскольку он заметил, что входной поток был закрыт.

Также (тангенциально )связаны:Что подразумевается под "держать трубу открытой"?


Вы можете встретить подобные петли:

while read variable || [ -n "$variable" ]; do
    # something with "$variable"
done

Это позволяет читать ввод, который не может быть должным образом завершен конечным символом новой строки. Без теста -nи без последнего символа новой строки в данных последняя (не завершенная -строка )в противном случае будет пропущена.

Утилита read, используемая в этом цикле, работает как тест. Если входной поток, к которому подключен цикл, закроет (, readчитает за конец файла ), readвернет не -нулевой статус выхода -, и цикл будет прекратить. С тестом -nон выполняет одну дополнительную итерацию , но эта дополнительная итерация просто подтвердит, что да, данных для чтения больше нет, и теперь значение $variableтакже пусто.

4
19.03.2021, 02:27

Теги

Похожие вопросы