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番目のパイプの書き込み側についても同じことを行います。

答え2

meow私は using がうまく機能することを指摘したかったのですEOF

Meow!スクリプトは次の名前のファイルに追加されますcat

#!/bin/sh
cat <<meow>> cat
Meow!
meow

以下を使用して別の名前で保存し、cats実行chmod +x cats可能にします./cats

$ ./cats
$ cat cat
Meow!
$ ./cats
$ cat cat
Meow!
Meow!

説明する:

  • cat <<meow~であるここのドキュメント通事論。これは、文字列に遭遇するまで行の後のテキストブロックを選択するようにスクリプトに指示しますmeow。これにより、コンテンツが出力(またはパイプ)されます。
  • >> cat.というファイルにパイプされますcat
  • >代わりに使用すると、>>ファイルを追加するのではなく上書きされます。
  • Meow!内容はここのドキュメント
  • meow閉じるタグですここのドキュメント。を使用してコンテンツ>>をに添付しますcat

標準出力とファイルにパイプされます。

要求されたパイプラインを完了するにはここのドキュメント必要です。

catテキストを出力して同時にテキストを渡すことはできませんが、tee正確に必要な操作を実行します。

echo echo | tee tee

その後、文字列が出力され、名前がとしてecho記録されます。echotee

catこれが要件の一部である場合は、次のように出力を渡すこともできます。

echo echo | tee tee | cat </dev/stdin

それ以外の場合:

echo echo | tee tee | cat

文書の内容:

$ cat tee
echo

答え3

パイプを介して要素のリストをループとして実行する必要がある場合に役立つバリエーションを追加したいと思いますwhile

cat <<EOF | while read -r FOO; do
bar
baz
quux
EOF

echo $FOO

done

猫なしでも使えます。

while read -r FOO; do
  echo $FOO
done <<EOF
bar
baz
quux
EOF

関連情報