2018年にもなって xargs でハマった

BSD と GNU 版の挙動の違いにハマった。

以下、ミニマムに試した結果。

環境
BSD xargs: macOS 10.12.6
GNU xargs: ubuntu 18.04 xargs (GNU findutils) 4.7.0-git

同じ

BSD xargs

$ echo "a b c" | xargs -n1
a
b
c

GNU xargs

$ echo "a b c" | xargs -n1
a
b
c

異なる

BSD xargs

$ echo "a b c" | xargs -n1 -I {} echo {}
a
b
c

GNU xargs

$ echo "a b c" | xargs -n1 -I {} echo {}
a b c

このように異なるおかげで、a, b, c と1つずつ処理しているつもりが、GNU版では一度に処理されてしまって、意図しない動きになっていた。

macOS では動くのに CI で動かない状態だったので、気づくのにすこし時間がかかった。つらい。

man をみたところ、GNU版は、-Iを使うとセパレータが改行になるらしい。ヘー。

面倒くさくなったので、xargs を使わないように改修した。