2つのheredocを猫にする方法は? [コピー]

2つのheredocを猫にする方法は? [コピー]

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_IOSunsetopt MULT_IOS

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

catstdin はパイプで、zsh はパイプのもう一方の端で 2 つの here ドキュメントの内容を順番に提供します。

出力リダイレクトにも同様の機能があります。

ls > a > b

lsパイプに書き込む間、zshは同時にa書いて書きbます(形式に似ていますtee)。一方、他のシェルのlsstdoutは切り捨てられますbaカットされますが記録されません)。

おすすめ記事