netcat과 tee에 대한 리디렉션 스타일이 다르면 결과가 달라집니다.

netcat과 tee에 대한 리디렉션 스타일이 다르면 결과가 달라집니다.

간단한 HTTP GET 요청과 응답을 추적하는 동안 nc이상한 점을 발견했습니다 .

예를 들어, 이것은 잘 작동합니다. in파일은 결국 HTTP GET 요청과 out파일 응답을 포함하게 됩니다.

$ mkfifo p
$ (nc -l 4000 < p | tee in | nc web-server 80 | tee out p)&
[1] 8299
$ echo "GET /sample" | nc localhost 4000
This is contents of /sample...
$ cat out
This is contents of /sample...
$

그러나 tee out p위의 내용을 바꾸면 tee out >p파일 out이 비어 있게 됩니다.

$ (nc -l 4000 < p | tee in | nc web-server 80 | tee out > p)&
[1] 8312
$ echo "GET /sample" | nc localhost 4000
$ cat out
$ 

왜 그럴까요?

편집하다:저는 RHEL 5.3(Tikanga)을 사용하고 있습니다.

답변1

문제는 동일한 파일을 읽고 쓰기 위해 쉘 리디렉션을 사용하고 있다는 것입니다. 나중에 확인하면 p비어 있을 것입니다. 쉘은 파일을 읽기 모드로 열고, 파일을 자르고, 명령을 실행하기 전에 파이프를 설정합니다. 그러나 를 사용하면 tee파일 자체가 열리므로 입력을 읽기 전에 파일이 잘리지 않습니다. 이는 잘 알려져 있고 문서화된 동작이며 단순히 리디렉션을 사용하여 파일을 인라인으로 변경할 수 없는 이유입니다.

답변2

FreeBSD tee맨페이지에서:

DESCRIPTION
 The tee utility copies standard input to standard output, making a copy
 in zero or more files.  The output is unbuffered.

버퍼링되지 않은 팁은 Bash(또는 쉘) 출력 리디렉션( > p)이 버퍼링되어 다른 동작을 유발할 수 있다는 것입니다.

(이에 대해 더 확신할 수 없어서 죄송하지만 댓글의 +1을 이것이 올바른 방향이라는 표시로 받아들입니다...)

관련 정보