here-documentsとcatで出力リダイレクトを使用する方法は?

here-documentsとcatで出力リダイレクトを使用する方法は?

別のコマンドでパイプまたはファイルにリダイレクトしたいスクリプトがあるとします(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番目のパイプの書き込み側についても同じことを行います。

おすすめ記事