cronの質問です。

/dev/null 2&>1 と /dev/null 2>&1の違いはなんでしょうか?

回答の条件
  • 1人2回まで
  • 13歳以上
  • 登録:2011/03/07 10:36:35
  • 終了:2011/03/07 17:33:31

ベストアンサー

id:a-kuma3 No.3

a-kuma3回答回数4521ベストアンサー獲得回数18792011/03/07 12:58:04

ポイント60pt

まず、比較をするなら、

コマンド >/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 の、「リダイレクト」というあたりを読むと、少し、幸せになれるかも、です。

その他の回答(3件)

id:vow No.1

ghost回答回数21ベストアンサー獲得回数92011/03/07 11:17:15

ポイント23pt

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 と同義です。

id:Mook No.2

Mook回答回数1312ベストアンサー獲得回数3912011/03/07 12:48:09

ポイント45pt
/dev/null 2&>1

という書き方は通常のシェルではないと思うのですが、期待通りに動くのでしょうか?

リダイレクトでは ">&" で一つのオペレーションですので、"&>" は、

"&"(バックグラウンド実行)と">"(リダイレクト)として解釈されると思いますが、

その前に /dev/null が付くのはおかしな気がします。


下記のサイトは詳細に説明しているので、ご一読をお勧めします。

http://x68000.q-e-d.net/~68user/unix/pickup?%A5%EA%A5%C0%A5%A4%A...

id:a-kuma3 No.3

a-kuma3回答回数4521ベストアンサー獲得回数18792011/03/07 12:58:04ここでベストアンサー

ポイント60pt

まず、比較をするなら、

コマンド >/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 の、「リダイレクト」というあたりを読むと、少し、幸せになれるかも、です。

id:toki-2131 No.4

toki-2131回答回数138ベストアンサー獲得回数12011/03/07 16:41:56

特に何も違いはないけど

  • id:a-kuma3
    vow> &> は bash の独自拡張で、本来は >& とは別の意味ですが >& としても使えます。

    あちゃー、やっぱりそうだったか。
    普段使わない、ksh、bash、tcsh なんかはどうだかな、とは思ってたんだけど。

    ・コマンドがバックグラウンドで実行されるわけじゃない
    ・標準エラー出力が "1" というファイルに書き出される

    というのが sh との違いになるのかな。
  • id:vow
    いずれにしてもこの例での &> は十中八九ただの書き間違いだろうとは思いますが。
    実は /dev/null も本当に引数だったりして・・・真相は文脈依存。

    ところで当該部の「としても」は曖昧でしたな。厳密には「と書いても」の意味です(ただし &> は後続をFD値として解釈しない点は異なる)。逆に言うと bash では >& の後にFD値でなくファイルを指定しても動いてしまいます・・・
  • id:yo-jiro-11
    a-kuma3さんvowさんコメントありがとうございました。
    私の頭は4bit位しかないのでオーバーフローしまくってます!!(笑)

    実は、買ったソフトの必要設定作業にこの記述があって、これ同意味だろうか?って・・
    結論的には、この記述で予想結果が得られてましたのでvowさんのご指摘どおりかと・・

    お二方ありがとうございました。また、よろしくお願いします。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません