web-dev-qa-db-ja.com

標準出力を閉じる(>&-)

ターミナルから起動したGUIプログラムがコンソールに書き込めないようにしようとしています。これを行うには、guiprogram >&-を実行します。これにより、一部の操作でプログラムがフリーズします。

>&-演算子は正確に何をしますか?それの意図された目的は何ですか?例を挙げていただけますか?それを使用してコンソールへの書き込みを防ぐことは合法ですか?標準出力を閉じるときにプログラムがフリーズするのはなぜですか?

2
Shamaoke

プログラムからの出力がどこにも表示されないようにする場合は、/dev/nullにリダイレクトします。

guiprogram >/dev/null 2>&1

stdoutを閉じることは、プログラムが閉じたファイルを処理する方法を知っている場合にのみ機能します。

>&-の実用的な使用はまれです。後で別の出力先をstdoutに割り当て、元の出力チャネルが適切に閉じられたことを確認したい場合に使用できます。

2
nohillside

プログラムがフリーズする理由を知るには、ソースコードを調べる必要があります。中止またはクラッシュするか、問題を無視する可能性があります。

bash -c 'exec >&-; echo foo; echo bar >&2'
    bash: line 0: echo: write error: Bad file descriptor
    bar

このシェルコードは問題を無視します。

bash -c 'set -e; exec >&-; echo foo; echo bar >&2'
    bash: line 0: echo: write error: Bad file descriptor

このシェルコードはエラーのため中止されます。

「正常にログに記録されるまで繰り返す」というループを持つある種のログ機能がある場合、フリーズが発生する可能性があります。ファイル記述子1への書き込みが失敗し、プログラムが無限ループに陥るため、これは発生しません。

1
Hauke Laging