Потому что я влюбился в него, я хотел бы оставить заметку. Я нашел эту ветку, потому что мне нужно переписать старый сценарий sh , чтобы быть совместимым с POSIX. В основном это означает, чтобы обойти эту проблему трубы/подоболочку введенную POSIX путем переписывания кода, как это:
some_command | read a b c
в:
read a b c << EOF
$(some_command)
EOF
И такой код:
some_command |
while read a b c; do
# something
done
в:
while read a b c; do
# something
done << EOF
$(some_command)
EOF
Но последний не ведет себя одинаково на пустом входе. Со старой записью цикл while не вводится на пустом входе, , но в обозначении POSIX это так! Я думаю, что это связано с новой линией перед EOF, , которую нельзя опустить. код POSIX, который ведет себя больше как старые обозначения выглядит следующим образом:
while read a b c; do
case $a in ("") break; esac
# something
done << EOF
$(some_command)
EOF
В большинстве случаев это должно быть достаточно. Но, к сожалению, это все еще ведет себя не так, как старая нотация , если some_command печатает пустую строку. В старой нотации в то время как тело выполнено и в обозначении POSIX мы ломаемся перед телом.
подход, чтобы исправить это может выглядеть следующим образом:
while read a b c; do
case $a in ("something_guaranteed_not_to_be_printed_by_some_command") break; esac
# something
done << EOF
$(some_command)
echo "something_guaranteed_not_to_be_printed_by_some_command"
EOF
Ваш пример .. эхо «привет мир» | прочитать тест; echo test = $ test работал отлично для меня .. результат: test = hello world; в какой среде это работает? Я использую bash 4.2 .. –
Вы хотите, чтобы несколько строк в одном прочтении? Ваш пример показывает только одну строку, но описание проблемы неясно. –
@ alex.pilon, я запускаю Bash версии 4.2.25, и его пример тоже не работает для меня. Может быть, это вопрос варианта исполнения Bash или переменной окружения? Я пример не работает с Sh ни, так может быть, Bash может попытаться быть совместимым с Sh? – Hibou57