在尝试跟踪一个简单的 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
问题是您正在使用 shell 重定向来读取和写入同一文件。之后检查p
一下,它也会是空的。 shell 以读取模式打开它,截断文件,同时在运行命令之前设置管道。但是,使用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(或您的 shell)输出重定向 ( > p
) 可能已被缓冲,从而导致不同的行为。
(很抱歉,我对此无法更加确定,但我将评论中的 +1 视为这是正确轨道的指标......)