如何cat兩個heredocs?
當給 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 寫入a
並b
同時寫入(如 的一種形式tee
),而在其他 shell 的ls
標準輸出中將只是b
(並且a
會被截斷但從未寫入)。
cat
沒有任何 args 將讀取其標準輸入(即文件描述符 0)直到文件結束,並將其複製到其標準輸出(即文件描述符 1)。
cat
使用一個或多個 args 將嘗試依次打開這些 args 作為其輸入,並將數據複製到其標準輸出。在這種情況下,它會忽略標準輸入,這是一件好事,因為在執行 eg 之後必須鍵入ctrl
+會變得非常煩人。這解釋了為什麼在給定文件名時忽略“此處”文件。作為一種特殊情況,您可以提供一個文件名,該文件名被解釋為“標準輸入”——這樣您就可以將一個文件與“這裡”文件結合起來。D``cat /etc/motd``cat``-
shell 只能將一個文件作為標準輸入傳遞給一個命令,因此將兩個“here”文件傳遞給一個命令沒有多大意義;只有最後一個實際上會將其作為命令的標準輸入。