私はLinuxスクリプトにコマンドパラメータがあることを見て、> /dev/null 2>&1
これが出力をnullにリダイレクトしていることを知っています。つまり、沈黙を意味します。数字0,1,2(STDIN、STDOUT、STDERR)も知っていますが、この行がなぜ必要なのかわかりません。
2>&1
基本的に違いが何であるかを知りたいです。
>/dev/null
そして
>/dev/null 2>&1
ベストアンサー1
2>&1
stdout が現在指している場所に stderr をリダイレクトします。このパラメータは、標準出力(たとえば、コマンドによる出力の削除/無音)を>/dev/null
リダイレクトします。/dev/null
ただし、stderrも削除(無音)する場合は、stdoutにリダイレクトしてからstderrを同じ場所にリダイレクトするように/dev/null
指定します。2>&1
はい(差分視覚化用):
$ ls
file1
file2
$ ls file1 > /dev/null
$
ここの出力は に転送さls file1
れるので何も得られません。しかし:file1
/dev/null
$ ls file12 > /dev/null
ls: cannot access file12: No such file or directory
出力のみに送信されるため、stderrが提供されます/dev/null
。stderrも削除/無音化したい場合は、stderrをstdoutにリダイレクトすると、両方が次に送信されます。/dev/null
次のように:
$ ls file12 >/dev/null 2>&1
$
ノートリダイレクトの順序/順序が重要です。2>&1
標準エラーリダイレクトは、常に標準出力リダイレクトの後に実行する必要があります。それ以外の場合は何も行いません。上記の例で実行すると、ls file12 2>&1 >/dev/null
stderrが端末に印刷されることがわかりますが、実行するとls file12 >/dev/null 2>&1
そうではありません。
- あるいは、
ls file1 file12 2>/dev/null 1>&2
同じ効果を得ることができます。まず、stderrにリダイレクトして/dev/null
からstdoutをリダイレクトして、stderrが現在指しているのと同じ場所を指すようにします。 - 最新バージョンのbashでは、次のものも使用できます。
>&
例:ls file12 >& /dev/null
stdoutとstderrを次にリダイレクトします。/dev/null