bashで複数のhere-docsを使用することは可能ですか?


14

複数のヒアドキュメントを使用して、bashのコマンドに入力を提供できますか?

$ cat <<<foo <<<bar
bar
$ cat <<EOF1 <<EOF2
> foo
> EOF1
> bar
> EOF2
bar

明らかに、どちらの場合でも、2番目のhere-docはstdinとして使用され、最初の参照を置き換えます。echo代わりにs を使用するソリューションですか?

$ cat <(echo -n foo) <(echo bar)
foobar

また、何らかの理由で、組み合わせを使用してもうまくいきませんでした。どうしてですか?

$ cat <<<foo <(echo bar)
bar
$ cat <(echo -n foo) <<<bar
foo

ヒアドキュメントを1つに結合するのではなく、2つのヒアドキュメントを使用するという事実の背後にある理由はありますか?
豆14

1
@beans実際にpaste、ダミーの入力でテストするときにそれに遭遇しました。私は他のいくつかのシナリオを考えることができると思います。いくつかの変数に事前に操作されたテキストを含むスクリプトがあった場合、たとえば、ファイルのみを受け取るコマンドで両方に何かをしたいと思うかもしれませんdiff
スパラフーク

別のユースケース(シェルスクリプトを作成するためにhere-docsを使用してこれを見つけました):変数展開のある数行と、それ以外の数行が必要ですcat <<EOF1 <<"EOF2"
トビー・スパイト

回答:


18

できるよ:

cat /dev/fd/3 3<< E1 /dev/fd/4 4<< E2
foo
E1
bar
E2

ファイル記述子0が1つしかないため、stdinは1つしか存在できません。

cat << EOF
eof
EOF

の略です:

cat /dev/fd/0 0<< EOF
eof
EOF

そして:

cat <<< foo

は:

cat /dev/fd/0 0<<< foo

ファイル記述子0で何を開くかを決めなければなりません。

cat <(echo foo)

は:

cat /dev/fd/123

123パイプへのファイル記述子はどこにあり、並行して、bash echo fooは別のプロセスで実行され、stdoutはパイプのもう一方の端にリダイレクトされます。

ファイル名をcatに渡すと、catstdinから読み取れなくなります。必要なもの:

cat <(echo foo) /dev/fd/0 << EOF
bar
EOF

または:

cat <(echo foo) - << EOF
bar
EOF

(標準入力から読み込む-ように指示catすることです)。


1
cat <<EOF正確には同じではありませんcat /dev/fd/0...:後者の場合cat、ファイル名を参照して開きます。
ミケル14

@Mikel、私が意味したのは、機能的に同等であるということです。任意の引数を渡されていない場合は、catそのからの読み込みfdの引数を渡されたかのように、0 -または/dev/fd/0(Linuxの(およびLinuxのみ)に、開口部がけれども/dev/fd/0、正確にファイルディスクリプタ0を複製するようではありません)。
ステファンシャゼル14

/dev/fd/3 3<< E1コンストラクトに非常に驚いたので、/ dev / fd /の下にあるアイテムとは一体何なのか疑問に思いました。プロセスごとにデフォルトで存在する1と2を除いて、プロセスがファイルシステム上のどこかでファイルを開いた後、なんとなく魔法のように見えますが。しかし、この例では、入力リダイレクトを除いて実際のファイルに接続されていないファイル記述子3と4を使用しています。私は、ファイル記述子の私の精神モデルでそれを理解することはできません。プロセスが別のファイルを開きたい場合、fd 5を使用する必要があることを知っていますか?fdsは3、4、5でなければなりませんか?
calavera.info

@ calavera.info、フォローアップの質問を作成したいようです。
ステファンシャゼラス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.