2014-07-02
GNU版, BSD版 xargsの挙動の違い
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として再オープン
BSD版 xargsの '-o'オプションなのですが, GNU版にはそのオプションは
実装されていません.
問題となる場面
% echo -n somehost | xargs ssh
とすると
Pseudo-terminal will not be allocated because stdin is not a terminal.
のようなエラーが出て sshできません. このような場合 BSD版では
% echo -n somehost | xargs -o ssh
とすると STDINの再オープンが行われて sshが問題なく行えるように
なります.
GNU版での実現
若干長くなるのですが, 以下で実現できます.
% echo -n somehost | xargs sh -c 'ssh "$@" </dev/tty' ssh # 最後の sshは何でもよい
BSD版でもこれで動きますので, ポータブルにしたい場合は
こちらの書き方の方が良いかと思います.
おわりに
ポータビリティを保つ場合, xargsは注意して利用する必要がある
ことがわかりました.
- 26 https://www.google.co.jp/
- 10 http://t.co/rcx7CVYPQB
- 8 http://pipes.yahoo.com/pipes/pipe.info?_id=02db597254ec68550537866a2fca2ce6
- 8 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CEAQFjAD&url=http://d.hatena.ne.jp/syohex/20140702/1404250291&ei=kEqzU5-3H_3y5gK_lAE&usg=AFQjCNFHpU-0fXGJPPFut36n_6XoFQdyBw
- 6 http://feedly.com/index.html
- 3 http://t.co/md0yxKNSEB
- 3 http://www.google.co.jp/url?url=http://d.hatena.ne.jp/syohex/20110929/1317308531&rct=j&frm=1&q=&esrc=s&sa=U&ei=LFKzU5DxNo7UkwWSwYDABA&ved=0CDoQFjAG&usg=AFQjCNEBihl08fO_c2q2Rf8MC3c5pE514Q
- 2 http://ayato.hateblo.jp/entry/20140528/1401285600
- 2 http://reader.livedoor.com/reader/
- 2 http://www.bing.com/search?q=xfce4 topに移動&pc=cosp&ptag=A75DB878ECBE148E7B6F&form=CONBDF&conlogo=CT3210127
- 2014-06-30 AmidaikeBlog 3/31 9%
- 2014-06-30 marsのメモ 3/52 5%
- 2014-07-01 ryamada の弟子日記(遺伝学・統計遺伝学のメモ) 3/58 5%