xargs で空白・改行・クオーテーションが入った引数を安全に渡す

xargs で空白が入った引数を渡す場合、「'」か「"」で引数を囲む必要があります。しかし、これらでくくった場合のエスケープシーケンスが全く提供されていないため、引数にさらに同じクオーテーションが含まれていた場合に問題があります。また、改行を入れることも出来ません。

多くのシステムでは、引数の区切りにヌル文字を使い、xargs に -0 オプションを付けてファイルを渡すことで解決する方法がありますが、POSIX標準ではこの方法を使うことが出来ません。

「'」か「"」でくくらない場合、「\」の後の文字(改行含む)はそのまま扱う事が出来ます。これを利用し、引数の文字全てと行末に「\」を付け、最後の行の「\」を取り除くという操作をすることで表題を解決出来ます。

printf "%s\n" "$arg" |sed 's/./\\&/g;s/.*/&\\/;$s/\\$//' >>args

ただし、この方法では空文字列を渡すことが出来ないので、空文字列を使うおそれがある時は事前にチェックをして「''」と出力する必要があります。

xargs はデフォルトで「_」が来たら終了してしまうので、-E に空文字列を設定して無効化します。

xargs -E "" command... <args