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