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
為什麼?然後如何從兩個或多個文件描述符中同時讀取?
cat
按順序處理其參數;tail -f f1
繼續執行,所以cat
一直在等待輸入<(tail -f f1)
,而不是繼續處理<(tail -f f2)
。
tail -f f2
如果你殺死第一個,你會看到輸出tail
。同時跟踪多個文件的更好工具是
tail
它本身(至少是 GNUtail
):tail -f f1 f2
如果您不想看到文件頭,請使用
-q
:tail -qf f1 f2
cat a b
不會同時從a
and讀取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