`nohup`、`&`、およびリダイレクトの間で順序を指定しますか?

`nohup`、`&`、およびリダイレクトの間で順序を指定しますか?

リダイレクトで使用するときのnohup正しい順序は何ですか?&

他のコマンドが正しくないのはなぜですか?

例えば、

$ nohup firefox& &> /dev/null

$ nohup firefox &> /dev/null  &

リダイレクトと&

他の例、

$ nohup sleep 1000 & &>/dev/null

にリダイレクトされていませんが、/dev/nullまだリダイレクトされています./nohup.out

答え1

セクションから始めます。シェル文法マニュアルページからbash

簡単なコマンド

簡単なコマンド一連のオプションの変数割り当てで、その後にスペースで区切られた単語とリダイレクト、次によって終了します。制御演算子

だからリダイレクト&>/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

このnohupコマンドは、この例で実際に実行するコマンドです。言葉がfirefox記載されていないシェルを通してコマンドとして単に引数として渡されますnohupnohupコマンドがその引数で実行する操作は「シェルに依存しません」です。

もちろん、nohupその引数を受け入れてコマンドで実行するのがすべてです。

ポイントはシェルの観点から実際に行うことは、出力をリダイレクトすることですnohupいいえ出力firefox

ただし、nohup独自の出力が指定されている位置に応じて実行されるコマンドの出力に対して、他の操作が実行されます。 ~からPOSIX仕様nohup(強調する):

標準出力が端末の場合、すべての出力は次のように指定されます。便利標準出力は、現在のディレクトリのnohup.outファイルの末尾に追加する必要があります。追加のためにnohup.outを作成または開くことができない場合、出力はHOME環境変数で指定されたディレクトリにあるnohup.outファイルの末尾に追加する必要があります。 ...

標準エラーが端末であり標準出力は開いていますが、端末は開いていません。、命名ユーティリティが標準エラーに書き込んだすべての出力は、標準出力と同じオープンファイル記述にリダイレクトする必要があります。 ...

したがって、独自の魔法のためにnohup次のコマンドを実行すると、リダイレクトは期待どおりに機能します。

nohup utility >/dev/null &

stderr両方をリダイレクトする必要はなく、stdoutこのコマンドは次のものをnohupリダイレクトするためstderr便利nohup自分の出力がどこに向かうかによって異なります。 (携帯用ではないということは言うまでもありません&>。)

あなたの入力には移植性の問題もあります。stdin端末に接続されているので、何が起こるのかは実装によって異なります。 (望むよりnohupPOSIX仕様の「基本事項」の注意事項.)の代わりに、次のように使用する方が良いです。

nohup firefox >/dev/null </dev/null &

コメントですでに述べたように、nohupどんな状況でも背景の後ろにリダイレクトを入れてはいけません&

関連情報