리디렉션 연산자를 사용하여 stdin을 while 루프로 보내는 방법

리디렉션 연산자를 사용하여 stdin을 while 루프로 보내는 방법

제목에 올바른 단어를 사용하고 있는지 확실하지 않습니다. 다음을 시도하고 있습니다.

while read line; do
    echo "$line"
    exit;
done;  <( echo "foo\n"; exit )

while하지만 작동이 멈춥니다. 루프가 프로세스로부터 어떤 입력도 받지 못하는 것 같습니다 echo. 이 작업을 수행하는 올바른 방법과 이것이 잘못된 이유를 아는 사람이 있습니까?

나는 이것을 할 수 있다:

echo "foo" | while read line; do echo "$line"; done;

하지만 저는 학습 목적으로만 첫 번째 방법을 택하고 싶습니다. 프로세스 교체가 필요한지 잘 모르겠습니다.

답변1

루프 후에도 스크립트가 계속되고 ${line}.

세미콜론을 제거하고 done프로세스 대체 사이에 입력 리디렉션을 넣습니다.

done < <( echo "foo\n"; exit )

exit프로세스 교체 실행을 명시적으로 종료할 필요는 없습니다 .

그러나 텍스트 파일 처리의 경우 일반적으로 sed또는 를 사용하는 것이 더 좋고 안전 하며 awk, 이는 또한 더 나은 성능을 제공합니다. 텍스트 줄을 처리하기 위해 정말로 Bash를 사용해야 한다면 일반적으로매우다음을 수행하는 것이 좋습니다.(루프의 첫 번째 줄만 표시됩니다)

while IFS= read -r line ; do

당신이 정말로 다른 것이 필요하다는 것을 알지 않는 한.

이는 Bash에서 각각 구분 기호 및 이스케이프 문자로 구문 분석, 압축 및 해석되는 공백, 줄 바꿈 및 백슬래시가 포함된 입력 줄의 원시 처리에 필요합니다.

관련 정보