トップ «前の日記(2011-10-31) 最新 次の日記(2011-11-08)» 編集

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

Tags: Linux Unix

*1 そもそも手作業のときは一度 find でリストだけ出すってのが習慣になってるので --no-run-if-empty もまったく必要ないんですよね。

本日のツッコミ(全3件) [ツッコミを入れる]
_ syohex (2011-11-08 09:57)

--no-run-if-emptyと同じ意味である -rオプションだと <br>FreeBSD, NetBSD, OpenBSDの xargsで実装されている <br>ようなので、*BSD + Linuxでは場合分け不要になりそうです。 <br> <br>ただ Mac OSXの manには書いていないので、 <br>Macを含めると場合分けが必要になりそうです。 <br>

_ wtnabe (2011-11-08 12:17)

おーなるほど。とりあえず10.6のxargsにはないですけど、共通で使えるものはあるんですね。参考になります。

_ のだ (2011-11-29 12:30)

grep のように引数が一つと二つ以上で出力形式が違う(引数一つだとファイル名が出ない)ものに対し、引数に /dev/nullを足しとくことがありますね。 <br>find . -name '*hoge*' | xargs grep query /dev/null <br>みたいに。似た話だけど違う話。