web-dev-qa-db-ja.com

`Nohup`、`& `とリダイレクトの間の順序?

一緒に使用する場合、Nohup&とリダイレクトの間の正しい順序は何ですか?

他の注文が正しくないのはなぜですか?

例えば、

$ Nohup firefox& &> /dev/null

$ Nohup firefox &> /dev/null  &

リダイレクト付きのNohupと&の間で順序を変更する方法がわかりません。

もう一つの例、

$ Nohup sleep 1000 & &>/dev/null

/dev/nullにリダイレクトされませんが、それでも./Nohup.outにリダイレクトされます。

3
Tim

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
2
Jakuje

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自身の出力が指している場所に応じてtilityNohupをリ​​ダイレクトするため、stderrNohupの両方をリダイレクトする必要はないことに注意してください。 (言うまでもなく、&>は移植性がありません。)

入力には移植性の問題もあります。 stdinは端末に接続されているため、実装によって異なります。 ( Nohup POSIX仕様の「Rationale」の下にある注 を参照してください。)代わりに、以下を使用する方がよい場合があります。

Nohup firefox >/dev/null </dev/null &

また、コメントですでに述べたように、Nohupやその他のコマンドでは、バックグラウンド&の後にリダイレクトを配置する必要がある状況はありません。

1
Wildcard