줄 바꿈을 사용하지 않음에도 불구하고 파이핑 중에 입력을 종료하는 방법은 무엇입니까?

줄 바꿈을 사용하지 않음에도 불구하고 파이핑 중에 입력을 종료하는 방법은 무엇입니까?

이 명령을 실행하면:

$echo -n "안녕하세요"

안녕하세요$

위의 출력을 얻습니다. 이는 echo -n이 개행 문자 종료 없이 문자열을 인쇄한다는 것을 의미합니다.

이제 파이프를 통해 출력을 읽습니다. 여기서 read 명령은 개행 문자가 나타날 때까지 계속 읽어야 합니다.

$echo -n "안녕하세요" |읽기

$

위 명령을 실행하면 명령 프롬프트로 돌아갑니다. 그러나 위 명령은 개행 문자를 만나지 않기 때문에 계속해서 입력을 기다리는 동안 중단될 것으로 예상됩니다. 왜 이런 일이 일어나지 않습니까?

답변1

해당 파이프라인의 종료 상태를 조사하면 read1이 반환되는 것을 알 수 있습니다.

$ 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파일 끝을 지나서 읽음) read0이 아닌 종료 상태가 반환되고 루프가 종료됩니다. 테스트 결과 -n실제로 그렇습니다한 번의 추가 반복, 그러나 추가 반복은 예, 더 이상 읽을 데이터가 없으며 이제 값 $variable도 비어 있음을 확인합니다.

관련 정보