간단한 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을 이것이 올바른 방향이라는 표시로 받아들입니다...)