Linuxのxargsには--no-run-if-empty付けとけ
知らなかったというか面倒で放置してた。
cronで定期実行するスクリプトの中に
find PATH CONDITIONS | xargs COMMAND
みたいなのがあったとして、これが時々エラー吐く、みたいなことがあったんですわ。あー xargs の呼び出すコマンド(例えば rm )に入力がないときにエラー出るんかー、変なのーって思いながら、ちょこちょこそれを忘れては引っかかり、をくり返していたんです。
なんでか今日分かりました。BSD の xargs を使った場合はそういうエラー出ないのです。だからすぐ忘れる。
GNU のバカーと思ったりしたのですが、man の恐ろしい量のオプションを読んでいたら
--no-run-if-empty
なんて文字が! なんてこった。というわけで実際のスクリプトの一部はこんな感じにしてみた。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#! /bin/sh | |
XARGS_NO_RUN='' | |
if [ `uname` = 'Linux' ]; then XARGS_NO_RUN='--no-run-if-empty'; fi | |
find PATH CONDITIONS | xargs $XARGS_NO_RUN COMMAND |
BSD のクセに gnu findutils 使ってるとか cygwin 使ってるやつのことなんか知らない。
[2011-11-09 追記] 最近の BSD xargs には -r というオプションがあって、これが findutils の xargs の -r と同じ動作をするそうです。残念ながら OSX 10.6 の xargs には存在しなかったので普段使いにはできないのですが、サーバ周りでは共通のオプションにできるかも。
zsh の alias というブコメががあるんですけど、cron で zsh 使わないので、それは今回のケースにおいては解法としてニーズに合ってないっす1。
そもそも手作業のときは一度 find でリストだけ出すってのが習慣になってるので –no-run-if-empty もまったく必要ないんですよね。 ↩