넘어지기 때문에 메모를 남기고 싶습니다. POSIX와 호환되도록 이전 sh 스크립트를 다시 작성해야하므로이 스레드를 찾았습니다. 이것은 기본적으로 다음과 같은 코드를 다시 작성하여 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가 빈 줄을 인쇄하면 여전히 이전 표기법과 정확히 동일하게 작동하지 않습니다. 오래된 표기법에서 while 본문이 실행되고 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