別のコマンドでパイプまたはファイルにリダイレクトしたいスクリプトがあるとします(sh
例ではパイプで接続)。私がbashを使っているとしましょう。
私は利用可能ですecho
:
echo "touch somefile
echo foo > somefile" | sh
以下を使用してほぼ同じ操作を実行することもできますcat
。
cat << EOF
touch somefile
echo foo > somefile
EOF
しかし、「EOF」を「EOF | sh」に変更すると、それがheredocの一部だと思います。
cat
標準入力からテキストを出力して任意の位置にパイプするにはどうすればよいですか?
ベストアンサー1
これを行う方法はいくつかあります。最も簡単なのは次のとおりです。
cat <<EOF | sh
touch somefile
echo foo > somefile
EOF
私の考えでより良い構文であるもう1つは次のとおりです。
(
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とechoは簡単です。 fd 3からリダイレクトされたファイル記述子(fd)0(stdin)を使用してcatを実行することを意味します
cat <&3
。つまり、fd 3から入力を削除します。 - 始める前に、
(...)
シェルはこれら2つの文書のリダイレクトを確認し、fd 0(<<EOF
)とfd 3()をパイプの読み取り端に置き換えます。3<<EOF2
- 初期コマンドが開始されると、シェルはEOFに達するまで標準入力を読み取り、それを最初のパイプの書き込みの終わりに送信します。
- 次に、EOF2と2番目のパイプの書き込み側についても同じことを行います。