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

答え2

この特定のスクリプトに標準出力を削除させるには:

与えられたスクリプト:

date
date -r /var/empty/foo

できるだけ編集してください。グループコマンド。このようにコマンドをグループ化すると、結合されたコマンドの標準出力と標準エラーストリームは、グループが論理的に単一のコマンドであるかのように処理(リダイレクト、パイプ、破棄など)される可能性があります。

例えば:

{
date
date -r /var/empty/foo
} > /dev/null

標準出力は削除されますが、標準エラーストリームのルーティングは変更されません。

次のスクリプト:

{
date
date -r /var/empty/foo
} > /dev/null 2>&1

標準出力を/ dev / nullにリダイレクトし、標準エラーを標準出力にリダイレクトし、stderrとstdoutを削除します。この特定の構文は次のとおりです。

{
date
date -r /var/empty/foo
} > /dev/null 2>/dev/null

関連情報