端末でプログラムを起動するには、次のコマンドを使用しました。
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/null
stdout
stderr
/dev/null
&>/dev/null
&
答え2
> / dev / nullを使用すると、実際に操作がキャンセルされます。
2>&1 を使用すると、エラー・ストリーム・テキストを出力ストリームにリダイレクトできます。これは、誰かが実際にエラーが発生したコマンドを実行しようとしたときに最もよく理解されます。コマンドをそのまま2回使用してから、2>&1を使用してコマンドを実行します。
これが少なくとも初心者に役立つことを願っています。ありがとうございます。