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

问题是您正在使用 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 视为这是正确轨道的指标......)

相关内容