別のコマンドでパイプまたはファイルにリダイレクトしたいスクリプトがあるとします(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
記録されます。echo
tee
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