リダイレクトで使用するときの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
記載されていないシェルを通してコマンドとして単に引数として渡されますnohup
。nohup
コマンドがその引数で実行する操作は「シェルに依存しません」です。
もちろん、nohup
その引数を受け入れてコマンドで実行するのがすべてです。
ポイントはシェルの観点から実際に行うことは、出力をリダイレクトすることですnohup
。いいえ出力firefox
。
ただし、nohup
独自の出力が指定されている位置に応じて実行されるコマンドの出力に対して、他の操作が実行されます。 ~からPOSIX仕様nohup
(強調する):
標準出力が端末の場合、すべての出力は次のように指定されます。便利標準出力は、現在のディレクトリのnohup.outファイルの末尾に追加する必要があります。追加のためにnohup.outを作成または開くことができない場合、出力はHOME環境変数で指定されたディレクトリにあるnohup.outファイルの末尾に追加する必要があります。 ...
標準エラーが端末であり標準出力は開いていますが、端末は開いていません。、命名ユーティリティが標準エラーに書き込んだすべての出力は、標準出力と同じオープンファイル記述にリダイレクトする必要があります。 ...
したがって、独自の魔法のためにnohup
次のコマンドを実行すると、リダイレクトは期待どおりに機能します。
nohup utility >/dev/null &
stderr
両方をリダイレクトする必要はなく、stdout
このコマンドは次のものをnohup
リダイレクトするためstderr
便利nohup
自分の出力がどこに向かうかによって異なります。 (携帯用ではないということは言うまでもありません&>
。)
あなたの入力には移植性の問題もあります。stdin
端末に接続されているので、何が起こるのかは実装によって異なります。 (望むよりnohup
POSIX仕様の「基本事項」の注意事項.)の代わりに、次のように使用する方が良いです。
nohup firefox >/dev/null </dev/null &
コメントですでに述べたように、nohup
どんな状況でも背景の後ろにリダイレクトを入れてはいけません&
。