質問: ヒアドキュメントや猫と組み合わせて出力リダイレクトをどのように使用しますか? 別のコマンドにパイプしたり、ファイルにリダイレクトしたりするスクリプトがあるとします(例ではshにパイプします)。私がbashを使用していると仮定します。echoを使用してそれを行うことができます:echo "touch somefile echo foo > somefile" | sh catを使用しても、ほぼ同じことができます。cat << eof touch somefile echo foo > somefile eof しかし、 "eof"を "eof | sh"に置き換えると、それは単にヒアドキュメントの一部であると見なされます。catがstdinからテキストを出力し、それを任意の場所にパイプするようにするにはどうすればよいですか?
回答: これには複数の方法があります。最も単純なものはおそらくこれです:cat <<eof | sh touch somefile echo foo > somefile eof 別の、私の意見ではより良い構文です:( cat <<eof touch somefile echo foo > somefile eof ) | sh これも機能しますが、サブシェルはありません。{ cat <<eof touch somefile echo foo > somefile eof } | sh その他のバリエーション:cat <<eof | touch somefile echo foo > somefile eof sh または:{ cat | sh; } << eof touch somefile echo foo > somefile eof ところで、私はあなたの質問でのcatの使用が何か他のプレースホルダーであることを期待しています。そうでない場合は、次のように取り出します。sh <<eof touch somefile echo foo > somefile eof これはこれに簡略化できます:sh -c 'touch somefile; echo foo > somefile' または:sh -c 'touch somefile echo foo > somefile' パイピングの代わりに出力をリダイレクトするsh >out <<eof touch somefile echo foo > somefile eof catを使用してecho test > outと同等のものを取得する:cat >out <<eof test eof 複数のヒアドキュメント( cat; echo ---; cat <&3 ) <<eof 3<<eof2 hi eof there eof2 これは出力を生成します:hi --- there これが起こっていることです: シェルは( ... )を確認し、囲まれたコマンドをサブシェルで実行します。 猫とエコーは十分に単純です。 cat <&3は、fd 3からリダイレクトされたファイル記述子(fd)0(stdin)でcatを実行するように言っています。つまり、fd 3からの入力を除外します。 (...)が開始される前に、シェルは2つのhereドキュメントのリダイレクトを確認し、fd 0(<<eof)とfd 3(3<<eof2)をパイプの読み取り側に置き換えます 最初のコマンドが開始されると、シェルはeofに達するまでstdinを読み取り、それを最初のパイプの書き込み側に送信します 次に、eof2と2番目のパイプの書き込み側で同じことを行います