Answers:
cat
继续阅读直到获得EOF。管道仅在输入得到EOF时才在输出上产生EOF。日志记录守护程序正在打开文件,对其进行写入并使其保持打开状态(就像对常规文件一样),因此永远不会在输出中生成EOF。cat
只是继续阅读,每当耗尽管道中的当前内容时就会阻塞。
您可以自己手动尝试:
$ mkfifo test
$ cat test
在另一个终端:
$ cat > test
hello
另一个端子将输出。然后:
world
另一个端子将有更多输出。如果现在使用Ctrl-D输入,则另一个cat
也将终止。
在这种情况下,cat
和之间唯一可观察到的区别tail -f
是日志记录守护程序是终止还是重新启动:cat
在管道的写端关闭时将永久停止,但是tail -f
在守护程序重新启动时将继续运行(重新打开文件)。
world
,然后,“ world”出现在另一个终端中。
和之间的缓冲也有所不同。您可以查看以下内容:cat
tail -f
创建管道: mkfifo pipe
开始cat
在后台使用管道:cat pipe &
打开管道并每秒写入一次: perl -MFcntl -we 'sysopen(my $fh, "pipe", O_WRONLY | O_NONBLOCK); while() {warn "written: " . syswrite($fh, "hello\n"); sleep 1}'
现在尝试使用tail -f pipe &
代替cat
。因此,您可以看到在cat
通过perl脚本将它们写入管道后立即打印行,而tail -f
在打印到stdout之前将它们缓冲多达4kb。
cat
tail -f
仅显示最后一行并跟随时,显示整个文件。因此,如果文件较短,则它们的行为相同,但是如果文件较大(100多个行),则可以看到两者之间明显的区别。
有关这些命令的附加信息: