Bashスクリプトをstderrにリダイレクトしてもまだstdoutに出力されるのはなぜですか?

Bashスクリプトをstderrにリダイレクトしてもまだstdoutに出力されるのはなぜですか?

Bashスクリプトがあります。

#!/bin/bash
echo this should be visible only in the stderr output but it is not 1>&2
exit 0

また、このスクリプトを実行するカスタムアプリケーションもあります。アプリケーションは標準出力と標準エラーをキャプチャします。標準出力は空で、標準エラーには提供されたテキストが含まれています。今まではそんなに良くなった。ただし、コンソール(物理端末)でスクリプトを実行すると、次のようになります。

./my_script.sh

ディスプレイに何も印刷されないと予想しましたが、印刷されました。 、>&2など、さまざまなリダイレクトの組み合わせを試しましたが、>/dev/stderr結果は同じです。また、stdoutをnullにリダイレクトしようとしましたが、1>&2 >/dev/null明らかに私のテキストもnullに送信します。

これはどこで構成されていますか?端末でstderrの表示を停止するにはどうすればよいですか?

ベストアンサー1

スクリプトが標準エラーストリームを端末に送信しないようにするには、スクリプトをファイルに/dev/nullリダイレクトする必要があります。

コマンドラインからリダイレクトされた標準エラーストリームを使用してスクリプトを呼び出すか、スクリプト自体にエラーストリームをリダイレクトさせることでこれを実行できます。

エラーストリームをコマンドライン/dev/nullにリダイレクトするには、次のようにスクリプトを呼び出します。

./my_script 2>/dev/null

スクリプトが標準エラーストリームを自動的に削除するようにするには、/dev/nullスクリプト内でストリームをリダイレクトします。

#!/bin/bash

# Discard any diagnostic output, errors, and interactive prompts.
exec 2>/dev/null

echo 'This should not be visible.' >&2
echo 'This should be visible.'

/dev/null診断出力を渡すファイルのパス名に変更します。

/dev/null標準エラーストリームをファイルにリダイレクトしたり、標準エラーストリームをファイルにリダイレクトしても、標準出力ストリームは影響を受けません。

通常、スクリプトはexit 0

おすすめ記事