>/dev/null 2>&1&と/dev/null&の違い

>/dev/null 2>&1&と/dev/null&の違い

端末でプログラムを起動するには、次のコマンドを使用しました。

program_name >/dev/null 2>&1 &

しかし、最近会ったこのページ次の方法が推奨されます。

program_name </dev/null &>/dev/null &

では、最初のものが何を意味するのかを知っています。これは、stderrをstdoutとして指定し、stdoutを/ dev / nullとして指定することを意味します。つまり、stderrとstdoutは両方ともnullを指します。

しかし、2番目はどういう意味ですか?ターミナルからヘッドレスでプログラムを始めるにはどちらが良いですか?

ベストアンサー1

stdinデフォルトでは、プログラムを実行すると、標準入力()、標準出力(stdout)、および標準エラー()の3つの「標準」ファイルが開きますstderr。 Unixでは、「ファイル記述子」(stdin= 0、stdout= 1、= 2)にstderr関連付けられています。デフォルトでは、3つすべてが端末(画面上のコンテンツを表示し、プログラムに入力を入力するためのインターフェース)を制御するデバイスに関連付けられています。

シェルを使用すると、ファイル記述子を「リダイレクト」できます。演算子は>出力をリダイレクトし、<入力をリダイレクトします。

たとえば、

program_name > /dev/null

これは次のとおりです。

program_name 1> /dev/null

ファイル記述子1( 'stdout')の出力を ` / dev / null 'にリダイレクトする

同じ、

program_name 2> /dev/null

ファイル記述子2( 'stderr')の出力を '/dev/null'にリダイレクトする

リダイレクトしたい場合もあります。両方 stdoutファイルとして保存するstderrので、次のように考えることもできます。

program_name > /dev/null 2> /dev/null

ただし、これはファイル記述子へのインターリーブ書き込みを処理しません(これに関する詳細は別の質問です)。この問題を解決するには、次の操作を行います。

program_name > /dev/null 2>&1

これは、「ファイル記述子 1 への書き込みを/dev/nullファイル記述子 2 への書き込みがリダイレクトされる場所にリダイレクト」を意味します。これはファイル記述子へのインターリーブ書き込みを処理します。

このオプションは非常に一般的であるため、一部のシェルには短く、機能的に同じ略語が含まれています。

program_name &> /dev/null

最後に、出力をリダイレクトするのと同じように、入力をリダイレクトできます。

program_name < /dev/null

stdinファイル記述子0()はリダイレクトされ、/dev/nullプログラムが入力を読み取ろうとするとEOFを受け取ります。

これらすべてを総合すると、次のようになります。

program_name </dev/null &>/dev/null &

(1)実行program_name、(2)標準入力を/dev/null()からリダイレクト、(3)ファイル記述子1と2(および)を()にリダイレクト、(4)バックグラウンドでプログラムを実行()するとします。</dev/nullstdoutstderr/dev/null&>/dev/null&

おすすめ記事