为什么 cat 命令只从第一个文件描述符读取?

为什么 cat 命令只从第一个文件描述符读取?

我从控制台创建了 2 个空文件,并尝试同时读取它们。

$ echo -n '' | tee f1 > f2
$ cat f1 f2
$ cat <(tail -f f1) <(tail -f ./f2)

在另一个控制台上我已经运行了测试。

$ echo 'tee test' | tee -a f1 >> f2
$ echo 'f1 test' >> f1
$ echo 'f2 test' >> f2
$ cat f1 f2
tee test
f1 test
tee test
f2 test

但是,cat在第一个控制台上仅读取第一个fd.

$ cat <(tail -F ./f1) <(tail -F ./f2)
tee test
f1 test

为什么?那么如何同时读取两个或多个文件描述符呢?

答案1

cat按顺序处理其参数;tail -f f1继续运行,因此cat继续等待 上的输入<(tail -f f1),并且不会继续处理<(tail -f f2)

tail -f f2如果杀死第一个,您将看到输出tail

同时跟踪多个文件的更好工具就是tail它本身(至少,GNU tail):

tail -f f1 f2

如果您不想查看文件头,请使用-q

tail -qf f1 f2

答案2

cat a b不同时从a和读取b;它打开a,从头到尾读取它,关闭a,然后继续对作为参数给出的下一个文件执行相同的操作。

如果参数是伪文件tail -f,因此没有“结束”,cat则只会从第一个文件读取。

如果由于某种原因您只需要一次打开多个文件,paste 可能是一种方法:

$ echo f1 >f1; echo f2 >f2
$ cat <(tail -F f1) <(tail -F f2)
f1
^C

$ paste <(tail -F f1) <(tail -F f2)
f1      f2
^C

相关内容