2011-11-07 [長年日記]
_ Linuxのxargsには--no-run-if-empty付けとけ
知らなかったというか面倒で放置してた。
cronで定期実行するスクリプトの中に
find PATH CONDITIONS | xargs COMMAND
みたいなのがあったとして、これが時々エラー吐く、みたいなことがあったんですわ。あー xargs の呼び出すコマンド(例えば rm )に入力がないときにエラー出るんかー、変なのーって思いながら、ちょこちょこそれを忘れては引っかかり、をくり返していたんです。
なんでか今日分かりました。BSD の xargs を使った場合はそういうエラー出ないのです。だからすぐ忘れる。
GNU のバカーと思ったりしたのですが、man の恐ろしい量のオプションを読んでいたら
--no-run-if-empty
なんて文字が! なんてこった。というわけで実際のスクリプトの一部はこんな感じにしてみた。
BSD のクセに gnu findutils 使ってるとか cygwin 使ってるやつのことなんか知らない。
[2011-11-09 追記] 最近の BSD xargs には -r というオプションがあって、これが findutils の xargs の -r と同じ動作をするそうです。残念ながら OSX 10.6 の xargs には存在しなかったので普段使いにはできないのですが、サーバ周りでは共通のオプションにできるかも。
zsh の alias というブコメががあるんですけど、cron で zsh 使わないので、それは今回のケースにおいては解法としてニーズに合ってないっす*1。
*1 そもそも手作業のときは一度 find でリストだけ出すってのが習慣になってるので --no-run-if-empty もまったく必要ないんですよね。
--no-run-if-emptyと同じ意味である -rオプションだと <br>FreeBSD, NetBSD, OpenBSDの xargsで実装されている <br>ようなので、*BSD + Linuxでは場合分け不要になりそうです。 <br> <br>ただ Mac OSXの manには書いていないので、 <br>Macを含めると場合分けが必要になりそうです。 <br>
おーなるほど。とりあえず10.6のxargsにはないですけど、共通で使えるものはあるんですね。参考になります。
grep のように引数が一つと二つ以上で出力形式が違う(引数一つだとファイル名が出ない)ものに対し、引数に /dev/nullを足しとくことがありますね。 <br>find . -name '*hoge*' | xargs grep query /dev/null <br>みたいに。似た話だけど違う話。