cat STDIN이 스크립트에서 두 번 작동하지 않습니다.

cat STDIN이 스크립트에서 두 번 작동하지 않습니다.

HTML 형식(메서드 POST)의 다양한 정보와 텍스트 필드를 출력하는 스크립트가 있습니다. cat <&0 을 시도하면 올바르게 표시됩니다. 그러나 다음 몇 줄에서 cat <&0을 다시 시도했지만 아무것도 인쇄되지 않습니다. 내가 뭘 잘못했나요?

....
cat <&0
echo Content length is $CONTENT_LENGTH
cat <&0 | sed -e 's/&/\n/g' | cut -d'=' -f2

....

답변1

당신은 잘못한 것이 없습니다. 이것이 우리가 예상해야 하는 것입니다.

첫 번째는 cat <&0표준 입력의 전체 내용을 소비합니다. 그것이 바로 그것이기 때문입니다 cat. 끝까지 모든 입력을 읽습니다.

두 번째 항목이 cat <&0실행되면 표준 입력에서 사용할 수 있는 것이 없습니다. 이전에 파일 끝에 도달했습니다.

쉘 스크립트에서 표준 입력에 2개 이상의 패스를 수행해야 하는 경우 이를 임시 파일에 덤프한 다음 필요한 만큼 임시 파일을 처리해야 합니다.

임시 파일을 안전하게 생성 /tmp하고 스크립트가 종료되거나 종료될 때 해당 파일이 적절하게 삭제되도록 하는 것은 여러분의 몫입니다. :-)

그건 그렇고, <&0불필요하고 아무것도 하지 않습니다. 그것이 하는 일은 표준 입력인 파일 설명자 0에 대한 표준 입력을 지정하는 것입니다... 정의상 표준 입력이 이미 가리키는 곳입니다! 이 명령을 별도로 실행할 수 있습니다 cat.

답변2

표준 입력에서 두 번 읽으려면 어떻게든 버퍼링해야 합니다(대부분 임시 파일에서). 첫 번째 호출 은 파일에 데이터를 쓰는 cat호출로 대체될 수 있으며 , 두 번째 호출은 파일을 다시 읽습니다 (이 역시 필요하지 않습니다. 파일에서 직접 읽을 수 있습니다).teecatsed

tee > input_buffer  # Copy standard input to a file and standard output
echo Content length is $CONTENT_LENGTH
sed -e 's/&/\n/g' input_buffer | cut -d = -f2 

관련 정보