GNU版, BSD版 xargsの挙動の違い
細いところを見ていくと膨大な違いがあるんでしょうけど,
ハマりやすそうなところだけ.
GNU版は Linuxディストリビューションにインストールされているもので,
BSD版は MacOSX, 各種 BSDディストリビューションにインストールされて
いるものとしています.
入力に非空白文字が含まれない場合の挙動
GNU版は最低 1回はコマンドが実行されますが, BSD版は入力に非空白文字が
なければコマンドが実行されません.
例えば以下のコマンドを実行したとき,
% perl -wl -e 'print "\n" for 1..100 | xargs ls'
GNU版では lsが 1回実行されますが, BSD版では何も出力されません.
--no-run-if-empty, -rオプション
GNU版 xargsには, --no-run-if-empty(-r)オプションがあり, これを
指定することで, BSD版と同じ挙動となります. FreeBSD, NetBSD, OpenBSDの
xargsでは dummyオプションとして, -rを実装しているのですが, Macの
xargsでは -rオプションを実装していないので, -rをつけておけばポータブルに
なるというわけではありません.
なので, 各種 OSで動かす場合以下のようなことが必要に
なるかと思います.
#!/bin/sh set -e OS=$(uname) EMPTY_OPTION= if [ "x$OS" = "xDarwin" ]; then EMPTY_OPTION='' else EMPTY_OPTION='-r' fi command1 | xargs $EMPTY_OPTION command2
STDINの /dev/ttyとして再オープン
おわりに
ポータビリティを保つ場合, xargsは注意して利用する必要がある
ことがわかりました.