이 명령을 실행하면:
$echo -n "안녕하세요"
안녕하세요$
위의 출력을 얻습니다. 이는 echo -n이 개행 문자 종료 없이 문자열을 인쇄한다는 것을 의미합니다.
이제 파이프를 통해 출력을 읽습니다. 여기서 read 명령은 개행 문자가 나타날 때까지 계속 읽어야 합니다.
$echo -n "안녕하세요" |읽기
$
위 명령을 실행하면 명령 프롬프트로 돌아갑니다. 그러나 위 명령은 개행 문자를 만나지 않기 때문에 계속해서 입력을 기다리는 동안 중단될 것으로 예상됩니다. 왜 이런 일이 일어나지 않습니까?
답변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
0이 아닌 종료 상태가 반환되고 루프가 종료됩니다. 테스트 결과 -n
실제로 그렇습니다한 번의 추가 반복, 그러나 추가 반복은 예, 더 이상 읽을 데이터가 없으며 이제 값 $variable
도 비어 있음을 확인합니다.