/dev/null 2>&1に2>&1が必要なのはなぜですか?

/dev/null 2>&1に2>&1が必要なのはなぜですか?

私はLinuxスクリプトにコマンドパラメータがあることを見て、> /dev/null 2>&1これが出力をnullにリダイレクトしていることを知っています。つまり、沈黙を意味します。数字0,1,2(STDIN、STDOUT、STDERR)も知っていますが、この行がなぜ必要なのかわかりません。

2>&1

基本的に違いが何であるかを知りたいです。

>/dev/null

そして

>/dev/null 2>&1

ベストアンサー1

2>&1stdout が現在指している場所に 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/nullstderrも削除/無音化したい場合は、stderrをstdoutにリダイレクトすると、両方が次に送信されます。/dev/null次のように:

$ ls file12 >/dev/null 2>&1
$

ノートリダイレクトの順序/順序が重要です。2>&1標準エラーリダイレクトは、常に標準出力リダイレクトの後に実行する必要があります。それ以外の場合は何も行いません。上記の例で実行すると、ls file12 2>&1 >/dev/nullstderrが端末に印刷されることがわかりますが、実行するとls file12 >/dev/null 2>&1そうではありません。

  • あるいは、ls file1 file12 2>/dev/null 1>&2同じ効果を得ることができます。まず、stderrにリダイレクトして/dev/nullからstdoutをリダイレクトして、stderrが現在指しているのと同じ場所を指すようにします。
  • 最新バージョンのbashでは、次のものも使用できます。>&例:ls file12 >& /dev/nullstdoutとstderrを次にリダイレクトします。/dev/null

おすすめ記事