cron は関係なく、POSIX shell での redirect。
おそらく /dev/null の前にも > があったかと。
http://www.gnu.org/software/bash/manual/bashref.html#Redirection...
&> は bash の独自拡張で、本来は >& とは別の意味ですが >& としても使えます。
>& は POSIX 的に標準なので shell が bash でない環境でもたいてい使えます。
で結局、bash での &>/dev/null は、標準的な >/dev/null 2>&1 と同義です。
/dev/null 2&>1
という書き方は通常のシェルではないと思うのですが、期待通りに動くのでしょうか?
リダイレクトでは ">&" で一つのオペレーションですので、"&>" は、
"&"(バックグラウンド実行)と">"(リダイレクト)として解釈されると思いますが、
その前に /dev/null が付くのはおかしな気がします。
下記のサイトは詳細に説明しているので、ご一読をお勧めします。
http://x68000.q-e-d.net/~68user/unix/pickup?%A5%EA%A5%C0%A5%A4%A...
▽3
●
a-kuma3 ●60ポイント ベストアンサー |
まず、比較をするなら、
コマンド >/dev/null 2&>1 と コマンド >/dev/null 2>&1 の違いになります。
まず、書き方が正しい後者から。
>/dev/null は、コマンドの標準出力を、実体が無いファイルに吐き出す、という意味です。
2>&1 は、標準エラー出力の出し先を、標準出力と同じ所に吐き出す、という意味です。
この二つを書くことで、標準出力と、標準エラー出力が、どこにも出力されない (破棄される)、ということになります。
cron は、端末を持たない環境で実行されるので、端末に吐き出されるべき出力があると、
実行者にメールで通知されます。
ただ、「正常に動作しました」なんてメールをもらっても、うれしくない、というか、邪魔なだけなので、
先のような書き方をして、出力を捨てます。
後者は、以下の書き方と同じ意味になります。
コマンド 2 & >/dev/null >1
コマンドに "2" というパラメータを与えて、別プロセスで実行し、標準出力を捨てる。
標準出力の出し先を変える指定が二つあるので、二番目の >1 は、サイズ 0 のファイル名が "1" というファイルが作られるだけです。
要は、似ている書き方だけで、& と >& が全然違う意味を持っているということです。
cron の質問というよりは、cron がコマンド行を実行するために使っている sh の話になります。
man sh の、「リダイレクト」というあたりを読むと、少し、幸せになれるかも、です。
特に何も違いはないけど