Cat

為什麼 cat 命令只讀取第一個文件描述符?

  • October 20, 2017

在控制台中,我創建了 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它本身(至少是 GNU tail):

tail -f f1 f2

如果您不想看到文件頭,請使用-q

tail -qf f1 f2

cat a b不會同時從aand讀取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

引用自:https://unix.stackexchange.com/questions/399359