cat STDINはスクリプトで2回動作しません。

cat STDINはスクリプトで2回動作しません。

HTML形式(メソッドPOST)のさまざまな情報とテキストフィールドを出力するスクリプトがあります。 cat <&0 を試すと正しく表示されます。しかし、次の数行でcat <&0を再試行しましたが、何も印刷されません。私は何が間違っていましたか?

....
cat <&0
echo Content length is $CONTENT_LENGTH
cat <&0 | sed -e 's/&/\n/g' | cut -d'=' -f2

....

答え1

あなたは間違ったことはありません。これが私たちが期待すべきことです。

最初はcat <&0標準入力の内容全体を消費します。それがまさにそれだからですcat。最後まですべての入力を読みます。

2番目の項目がcat <&0実行されると、標準入力で使用できるものはありません。以前はファイルの終わりに達しました。

シェルスクリプトで標準入力に対して2つ以上のパスを実行する必要がある場合は、それを一時ファイルにダンプし、必要に応じて一時ファイルを処理する必要があります。

一時ファイルを安全に生成し、/tmpスクリプトが終了または終了したときにそのファイルを適切に削除することをお勧めします。 :-)

ところで、<&0不要で何もしません。それがするのは、標準入力であるファイル記述子0の標準入力を指定することです。このコマンドは別々に実行できますcat

答え2

標準入力から2回読み取るには、何らかの方法でバッファリングする必要があります(ほとんどの一時ファイルから)。最初の呼び出しはファイルにデータを書き込む呼び出しcatに置き換えることができ、2番目の呼び出しはファイルを再読み取りします(これも必要ありません。ファイルから直接読み取ることができます)。teecatsed

tee > input_buffer  # Copy standard input to a file and standard output
echo Content length is $CONTENT_LENGTH
sed -e 's/&/\n/g' input_buffer | cut -d = -f2 

関連情報