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
호출로 대체될 수 있으며 , 두 번째 호출은 파일을 다시 읽습니다 (이 역시 필요하지 않습니다. 파일에서 직접 읽을 수 있습니다).tee
cat
sed
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