回答:
&
コマンドの最後にある末尾の演算子は、コマンドをバックグラウンドに入れるために使用されます。これは、実際にはPOSIX標準で指定されている標準構文です。
非同期リスト
コマンドが制御演算子( '&')によって終了された場合、シェルはサブシェルでコマンドを非同期的に実行します。これは、シェルが次のコマンドを実行する前にコマンドの終了を待たないことを意味します。
バックグラウンドでコマンドを実行するための形式は次のとおりです。
command1&[command2&...]
コマンドをバックグラウンド化する目的は、スクリプト内のメインシェルまたはコマンドを待機するインタラクティブシェルなしでコマンドを実行することです。これにより、他のコマンドの実行がブロックされ、ユーザーが待つのが不便になります。これは、長時間実行されるコマンドを開始するのに便利ですが、現在のシェルで作業を続ける必要があります。ご想像のとおり、これはマルチタブターミナルエミュレーターがなく、ターミナルがコンピューター自体に接続された実際の物理ハードウェアであった時代に由来します。
定義から、&
コマンドリストのコマンドターミネーターとしても機能することがわかります;
。特定の例でpyprogramm >> /dev/null 2>&1 &
は、リストにはコマンドが1つしかありません。
より一般的には、
echo Hello ; echo World ;
そして
echo Hello & echo World &
;
and &
演算子で終了するリストの2つの例です。1つの違いは、ジョブ制御が無効になっ&
ている/dev/null
場合、終了リストには入力が接続されることです。
ジョブ制御が無効になっている場合(set、-mを参照)、明示的なリダイレクトが実行される前の非同期リストの標準入力は、/ dev / nullと同じプロパティを持つファイルに割り当てられていると見なされます。これは、ジョブ制御が有効になっている場合は発生しません。すべての場合において、標準入力の明示的なリダイレクトは、このアクティビティをオーバーライドします。
ただし、順次リストでは、stdin
明示的なリダイレクトがない場合、各コマンドはまだ端末に接続されています。
また、前述の定義から、&
サブシェルでコマンドを実行することに注意してください。対照的に、;
終了したリストは現在のシェルで実行されます。終了ステータスにも違いがあります。&
標準のために言う:
非同期リストの終了ステータスはゼロでなければなりません。
これは、バックグラウンドで複数のコマンドを配置する場合に重要です。スクリプトまたはコマンドを作成するときは、失敗したかどうかを気にしないコマンドを選択するか、非ゼロ(error)終了ステータスを処理する方法を見つける必要があります。あなたの特定の例でpyprogramm >> /dev/null 2>&1 &
は、バックグラウンドで実行すると、失敗したかどうかを示す何らかの方法が2>&1
必要ですが、使用していると判断すると、リダイレクトによってエラー出力が非表示になり、おそらくスクリプトが失敗しないと仮定します。
対照的に、;
終了ステータスは次のように定義されます。
順次リストの終了ステータスは、リスト内の最後のコマンドの終了ステータスです。
繰り返しになりますが、これはコマンドラインでコマンドのシーケンシャルリストを記述する方法と、リスト内のコマンドの一部が失敗した場合の処理方法に影響を及ぼします。
これはつまり、すべてのBourneシェルのようなことをPOSIX定義手段であるという事実bash
、dash
およびksh
それをサポートする必要があります。
&
リダイレクトでは&
、コマンドターミネーターとは異なります。これは、ファイル記述子オブジェクトを複製(コピー)することを意味します。出力リダイレクトの正確な意味と意味をご覧ください。
bash
あり|&
、オペレータが(パイプとアンパサンドの間にスペースに注意していません)。bashマニュアルから:
|&を使用すると、コマンドの標準エラーは標準出力に加えて、パイプを介してcommand2の標準入力に接続されます。2>&1 |の省略形です。この標準エラーの標準出力への暗黙的なリダイレクトは、コマンドで指定されたリダイレクト後に実行されます。
バックグラウンドでコマンドを実行することを意味します。呼び出したスクリプトは、呼び出されたコマンドが完了するまでブロックするのではなく継続します。
&
出力の非表示について言うことは正しく聞こえません。引用している標準の段落は、出力ではなく入力について述べています。ジョブ制御が有効になっているかどうかを区別する理由は、ttyから読み取ろうとするバックグラウンドプロセスが中断されるためです。その時点で、ジョブ制御を使用してフォアグラウンドに配置し、待機している入力を提供する必要があります。これらはすべて、ジョブ制御なしでは実行できないため、ジョブ制御が無効になっている場合は、stdinをリダイレクトする/dev/null
か、同等のものにする必要があります。