Cat

如何cat兩個heredocs?

  • April 2, 2015

當給 cat 兩個 heredocs 時,它只輸出第二個。

$ cat <<HERE
> adsf
> qwer
> HERE
adsf
qwer
$ cat <<HERE <<ALT
> qwer
> asdf
> HERE
> zxcv
> yuop
> ALT
zxcv
yuop

如果給定一個heredoc和一個文件,這也適用,儘管我注意到如果我給它一個文件和一個heredoc(相反的順序),它仍然只輸出文件。但是,如果我給 cat 兩個文件,它會正確輸出它們。

為什麼貓會有這樣的行為?

在具有以下功能的系統上/dev/fd/x

cat - << E0 /dev/fd/3 3<< E3
foo bar
E0
bar baz
E3

即在不同的文件描述符上打開兩個*here文件。*如果你在 fd 0 上打開它們,當然最後一個打開會覆蓋以前的。

上面的內容對於類似的命令會更有用paste

請注意,它zsh具有以下 MULT_IOS功能(預設啟用並unsetopt MULT_IOS在模擬其他 shell 時禁用),如果您不止一次為輸入重定向文件描述符,zsh 會提供相應輸入的串聯(通過單獨程序中的管道)。所以在zsh中:

$ cat << E1 << E2
heredoc> foo
heredoc> E1
heredoc> bar
heredoc> E2
foo
bar

cat的 stdin 是一個管道,然後 zsh 在管道的另一端依次提供兩個 here 文件的內容。

輸出重定向也有類似的功能。

ls > a > b

使ls寫入管道和 zsh 寫入ab同時寫入(如 的一種形式tee),而在其他 shell 的ls標準輸出中將只是b(並且a會被截斷但從未寫入)。

cat沒有任何 args 將讀取其標準輸入(即文件描述符 0)直到文件結束,並將其複製到其標準輸出(即文件描述符 1)。

cat使用一個或多個 args 將嘗試依次打開這些 args 作為其輸入,並將數據複製到其標準輸出。在這種情況下,它會忽略標準輸入,這是一件好事,因為在執行 eg 之後必須鍵入ctrl+會變得非常煩人。這解釋了為什麼在給定文件名時忽略“此處”文件。作為一種特殊情況,您可以提供一個文件名,該文件名被解釋為“標準輸入”——這樣您就可以將一個文件與“這裡”文件結合起來。D``cat /etc/motd``cat``-

shell 只能將一個文件作為標準輸入傳遞給一個命令,因此將兩個“here”文件傳遞給一個命令沒有多大意義;只有最後一個實際上會將其作為命令的標準輸入。

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