これを行うには複数の方法があります。最も簡単なものはおそらくこれです:
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
複数のHereドキュメント
( cat; echo ---; cat <&3 ) <<EOF 3<<EOF2
hi
EOF
there
EOF2
これにより、出力が生成されます。
hi
---
there
ここで何が起こっているのですか:
- シェルは、
( ... )
サブシェルで囲まれたコマンドを参照して実行します。
- 猫とエコーは非常に簡単です。インクルードは、
cat <&3
ファイル記述子を持つ猫を実行するように言う(FD)0(STDIN)FD 3からリダイレクト。つまり、fd 3からの入力を除外します。
(...)
が開始される前に、シェルは2つのhereドキュメントのリダイレクトを確認し、fd 0(<<EOF
)およびfd 3(3<<EOF2
)をパイプの読み取り側に置き換えます
- 初期コマンドが開始されると、シェルはEOFに達するまでそのstdinを読み取り、それを最初のパイプの書き込み側に送信します
- 次に、EOF2と2番目のパイプの書き込み側で同じことを行います
touch
そこにない限り、正確にあなたは何をしたいですか?入力ファイルを読み取り、stdoutで別のファイルにリダイレクトするだけですか?