catに2つのheredocが与えられると、2番目の文書のみを出力します。
$ cat <<HERE
> adsf
> qwer
> HERE
adsf
qwer
$ cat <<HERE <<ALT
> qwer
> asdf
> HERE
> zxcv
> yuop
> ALT
zxcv
yuop
これは、区切り文字とファイルが与えられたときにも機能します。ファイルと区切り記号(逆順)を与えると、まだファイルだけを出力することがわかりました。ただし、cat 2つのファイルを指定すると、両方のファイルが正しく出力されます。
猫はなぜこのような行動をするのですか?
ベストアンサー1
システムから/dev/fd/x
:
cat - << E0 /dev/fd/3 3<< E3
foo bar
E0
bar baz
E3
つまり、2つを開きます。ここにファイル別のファイル記述子にあります。 fd 0で開くと、もちろん最後に開いたものが前のものを上書きします。
上記のコマンドは、このようなコマンドでより便利ですpaste
。
次の機能(デフォルトで有効になっており、他のシェルをエミュレートするときは無効)zsh
に注意してください。入力のファイル記述子を複数回リダイレクトすると、zshはその入力の接続を提供します(別々のプロセスのパイプを介して)。だからzshでは:MULT_IOS
unsetopt MULT_IOS
$ cat << E1 << E2
heredoc> foo
heredoc> E1
heredoc> bar
heredoc> E2
foo
bar
cat
stdin はパイプで、zsh はパイプのもう一方の端で 2 つの here ドキュメントの内容を順番に提供します。
出力リダイレクトにも同様の機能があります。
ls > a > b
ls
パイプに書き込む間、zshは同時にa
書いて書きb
ます(形式に似ていますtee
)。一方、他のシェルのls
stdoutは切り捨てられますb
(a
カットされますが記録されません)。