bashのリダイレクト

フレッツADSLでダイナミックDNSを使う場合、フレッツADSLで割り当てられた IPアドレスをダイナミックDNSを運営しているサーバーに知らせる必要があります。
現在(2003.1.9)myDNS というサービスを使っています。
ここは定期的にこのサーバーにmail checkをすれば その時アクセスされたIPアドレスをダイナミックDNSに登録してくれます。
そこで、1時間ごとにcronでmail checkするのですが、そのたびにcronから mailが送られてきます。
そこでmailが送られないように/dev/nullに送りたいのですが、リダイレクトの ことでいまいちわからなかったのでちょっとメモを。


入出力の制御ということになるが、出力先として標準出力(stdout)、 標準エラー出力(stderr)、ファイルがある。
リダイレクト構文では1はstdoutを、2はstderrを表す。
特に指定しないときは標準出力、通常はディスプレイに表示される。
実行結果の出力先をファイルにしたいときは、
# ls -l > dirlist
や
# cat foo > bar
のようにリダイレクトする。しかしfooというファイルがなかったりして エラーになると、それはbarには書き込まれず(標準出力:stdoutでなく)、 標準エラー出力(stderr)に書き込まれ、通常はディスプレイに表示される。
リダイレクト構文は正確には
[n]> ファイル名
で、nがファイル・ディスクリプター(stdoutが1、stderrが2)になり、 nを省略した場合は1(stdout)が指定されたことになる。
次に標準エラー出力をファイルに書き込むには
# cat foo 2> bar
になる。この場合は実行結果(fooの内容)は標準出力、つまりディスプレイに 表示され、エラーがあった場合はbar書き込まれる。
実行結果をbarに、エラーはerrに書き出したいときは
# cat foo > bar 2> err
ファイル・ディスクプリターを省略しないと
# cat foo 1> bar 2> err
になる。
標準出力と標準エラー出力を同じファイルに書き込むには
# cat foo &> bar
とする。また、別の書き方として
# cat foo > bar 2>&1
もある。
今回の目的のcronでmailが送られるのをやめて内容を/dev/nullに送るには
# crontab -l
0 * * * * /usr/local/bin/ipupdate &> /dev/null
になる。
ただ、この場合エラーになっても/dev/nullに送られて気がつかないので、
# crontab -l
0 * * * * /usr/local/bin/ipupdate > /dev/null
の方がいいかも。