1. ホーム
  2. バッシュ

[解決済み】標準誤差を変数に格納する方法

2022-04-09 22:09:07

質問

例えば、以下のようなスクリプトがあるとします。

useless.sh

echo "This Is Error" 1>&2
echo "This Is Output" 

そして、もう1つのシェルスクリプトがあります。

alsoUseless.sh

./useless.sh | sed 's/Output/Useless/'

This Is Error"など、useless.shのstderrを変数に取り込みたいと思います。 ERRORと呼ぶことにしよう。

私が何かに標準出力を使用していることに注意してください。私はstdoutを使い続けたいので、stderrをstdoutにリダイレクトすることは、この場合、役に立ちません。

ということで、基本的には、以下のようにしたい。

./useless.sh 2> $ERROR | ...

が、これは明らかにうまくいきません。

ができることも知っています。

./useless.sh 2> /tmp/Error
ERROR=`cat /tmp/Error`

が、これは醜いし不要だ。

残念ながら、ここで答えが出なければ、そうせざるを得ないのです。

他の方法があればいいのですが。

どなたか良いアイデアをお持ちの方はいらっしゃいませんか?

解決方法は?

このようにエラーファイルを取り込むとすっきりします。

ERROR=$(</tmp/Error)

シェルはこれを認識し、''Module''を実行する必要はありません。 cat ' でデータを取得します。

もっと大きな問題は、ハードです。 簡単な方法はないと思うんです。 パイプライン全体をサブシェルに組み込んで、最終的にその標準出力をファイルに送って、エラーを標準出力にリダイレクトできるようにしなければならないでしょう。

ERROR=$( { ./useless.sh | sed s/Output/Useless/ > outfile; } 2>&1 )

セミコロンが必要なことに注意してください(古典的なシェル - Bourne、Korn - では間違いなく、おそらくBashでも同様です)。 また、' {} は、囲んだコマンドのI/Oリダイレクションを行います。 このように書くと sed を使用することもできます。

警告 形式的に未検証のコードです - 自己責任で使用してください。