一緒に使用する場合、Nohup
、&
とリダイレクトの間の正しい順序は何ですか?
他の注文が正しくないのはなぜですか?
例えば、
$ Nohup firefox& &> /dev/null
$ Nohup firefox &> /dev/null &
リダイレクト付きのNohupと&
の間で順序を変更する方法がわかりません。
もう一つの例、
$ Nohup sleep 1000 & &>/dev/null
/dev/null
にリダイレクトされませんが、それでも./Nohup.out
にリダイレクトされます。
bash
のマニュアルページのセクションShell GRAMMARから始めます。
簡単なコマンド
単純なコマンドは、オプションの変数割り当てのシーケンスであり、その後に空白で区切られた単語とリダイレクトが続き、制御演算子。
したがって、リダイレクト(&>/dev/null
)が最初に実行され、制御演算子が(&
)の後に続きます。
編集:そして答えを完成させるために、Nohup
は単純なコマンドの最初の部分です。 bash
では特別な意味はありません。
まさにあなたの例(それを複雑にするだけの/dev/null
を除く):
jakuje@E6430:/tmp$ rm Nohup.out out
jakuje@E6430:/tmp$ Nohup sleep 1 & &>out
[1] 10876
Nohup: ignoring input and appending output to ‘Nohup.out’
[1]+ Done Nohup sleep 1
jakuje@E6430:/tmp$ cat Nohup.out # empty
jakuje@E6430:/tmp$ cat out # empty
jakuje@E6430:/tmp$ rm Nohup.out
jakuje@E6430:/tmp$ Nohup sleep 1 &>out &
[1] 10882
[1]+ Done Nohup sleep 1 &> out
jakuje@E6430:/tmp$ cat Nohup.out # no file
cat: Nohup.out: No such file or directory
jakuje@E6430:/tmp$ cat out # output of Nohup
nohup: ignoring input
Nohup
コマンドは、この場合に実際に実行しているコマンドです。単語firefox
は解釈されませんシェルによってコマンドとして;引数としてNohup
に渡されるだけです。 Nohup
コマンドがその引数で行うことは、「シェルのビジネスではない」ということです。
もちろん、Nohup
が行うことは、その引数を取り、それをコマンドとして実行することです。
重要なのは、シェルの観点から実際に行っていることは、Nohup
の出力をリダイレクトすることです。notfirefox
の出力です。
ただし、Nohup
は、それ自体の出力がポイントされている場所に応じて、実行するコマンドの出力に対して異なる処理を実行します。 Nohup
のPOSIX仕様 (強調を追加)から:
標準出力が端末の場合、名前付きtilityによって標準出力に書き込まれるすべての出力は、末尾に追加されます。現在のディレクトリにあるファイルNohup.outの。 Nohup.outを作成したり、追加用に開くことができない場合、出力は、HOME環境変数で指定されたディレクトリ内のファイルNohup.outの末尾に追加されます。 .。
標準エラーが端末であり、標準出力が開いているが端末ではない場合、指定されたユーティリティによって標準エラーに書き込まれたすべての出力は、にリダイレクトされます。標準出力と同じオープンファイルの説明。 .。
したがって、Nohup
の内部の魔法により、次のコマンドを実行すると、リダイレクトは期待どおりに機能します。
Nohup utility >/dev/null &
stderr
コマンドはstdout
自身の出力が指している場所に応じてtilityのNohup
をリダイレクトするため、stderr
とNohup
の両方をリダイレクトする必要はないことに注意してください。 (言うまでもなく、&>
は移植性がありません。)
入力には移植性の問題もあります。 stdin
は端末に接続されているため、実装によって異なります。 ( Nohup
POSIX仕様の「Rationale」の下にある注 を参照してください。)代わりに、以下を使用する方がよい場合があります。
Nohup firefox >/dev/null </dev/null &
また、コメントですでに述べたように、Nohup
やその他のコマンドでは、バックグラウンド&
の後にリダイレクトを配置する必要がある状況はありません。