1. 概要

このクイックチュートリアルでは、Bashコマンドの出力を無音にする方法に焦点を当てます。

2. 前提条件

出力をサイレンシングする前に、コマンドを実行するときにBashが出力を処理する方法を最初に理解する必要があります。

2.1. 標準出力とエラー

Bashコマンドを実行すると、新しいプロセスが作成されます。 このプロセスからのエラーはすべてエラーストリームに書き込まれ、その他の出力はすべて出力ストリームに書き込まれます。

また、Bashは、数値のファイル記述子(FD)で示される、プロセスごとに複数のファイルを自動的に開きます。

これらのFDの2つは、標準出力(stdout)と標準エラー(stderr)です。 デフォルトでは、 Bashはエラーストリームをstderrに送信し、出力ストリームをstdoutに送信します。 stdoutとstderrの両方で、これらのFDに書き込まれた文字は、コマンドが実行されたコンソールに表示されます。

さらに、 Bashは、stdout FDに識別子1を割り当て、stderrFDに2を割り当てます。

2.2. 出力のリダイレクト

コマンドの出力を別のFDにリダイレクトすることで、エラーストリームと出力ストリームのデフォルトの宛先を変更できます。 リダイレクト演算子を使用して出力をリダイレクトします:>

たとえば、 echo コマンドを使用して、 Helloworldをファイルfoo.txtに書き込むことができます。

echo "Hello world" > foo.txt

2.3. ヌルデバイス

さらに、Linuxシステムには特定のデバイス / dev / null があり、書き込み時に何もしません。 したがって、/ dev/nullにリダイレクトされた出力はどこにも書き込まれません

3. サイレンシング出力

コマンドの出力を無音にするために、stdoutまたはstderrのいずれか(または両方)を / dev /nullにリダイレクトします。 リダイレクトするストリームを選択するには、リダイレクトオペレーターにFD番号を提供する必要があります。

3.1. 標準出力

エラー以外の出力を無音にするために、stdoutを / dev /nullにリダイレクトします。

command 1> /dev/null

デフォルトでは、リダイレクト演算子はstdoutをリダイレクトするため、1を省略できます。

command > /dev/null

3.2. 標準エラー

エラー出力を消音するために、stderrを / dev /nullにリダイレクトします。

command 2> /dev/null

3.3. すべての出力

stdoutとstderrの両方をリダイレクトするには、 stderrをstdoutにリダイレクトしてから、stdoutを/ dev /nullにリダイレクトする必要があります。 stderrをstdoutにリダイレクトするには、次の表記法を使用します。

2>&1

これをstdoutを/dev / null にリダイレクトすることと組み合わせて、すべての出力を無音にします。

command > /dev/null 2>&1

したがって、stdoutは / dev / null にリダイレクトされ、stderrはstdoutにリダイレクトされ、両方のストリームが / dev / null に書き込まれ、コマンドからのすべての出力がサイレンシングされます。

これを次のBash表記に短縮できます。

command &> /dev/null

この省略形は移植性がなく、Bash4以降でのみサポートされていることに注意してください。

一般的ではありませんが、stdoutとstderrを別々に / dev / null にリダイレクトすることもできますが、Bashスクリプトを自動生成するか、以前のアプローチを使用できない場合を除いて、このアプローチはお勧めしません。

command > /dev/null 2> /dev/null

4. 結論

このチュートリアルでは、Bashプロセスがエラー出力と非エラー出力をFDにストリーミングする方法と、リダイレクト演算子を使用してこれらのストリームを別のFDにリダイレクトする方法について学習しました。

リダイレクトを/dev / null デバイスと組み合わせることで、エラー出力、通常の出力、またはその両方を無音にすることができます。