GNU版とBSD版で挙動を揃える

下記コマンドでGNU版とBSD版のxargsの違いを無視してcommand1の結果が空のときにcommand2を実行しないようにできる。

command1 | xargs $(: | xargs echo '--no-run-if-empty') command2

xargsは引数をまとめてコマンドを実行する

xargsは標準入力から読み取った項目を引数にして指定したコマンドを実行する。デフォルトでは引数はシステム的に許容される限界まで長くなるように渡され、一度で全ての項目を処理できない場合は複数回コマンドが実行される。

コマンドを指定しなかった場合はechoが実行される。

: (colon) は何も実行しない

bashにおけるコロンコマンドは組み込みコマンドで何も実行しない。当然標準出力にも出力されるものはない。

xargs (GNU) は入力が空でも実行される

  1. 入力があるときは処理が実行される。

    echo a | xargs | wc -l
    # => 1
    
  2. 入力が空のときは処理が実行される

    : | xargs | wc -l
    # => 1
    
  3. 入力が空で--no-run-if-emptyオプションが指定されているときは処理が実行されない

    : | xargs --no-run-if-empty | wc -l
    # => 0
    

xargs (BSD) は入力が空なら実行されない

  1. 入力があるときは処理が実行される。

    echo a | xargs | wc -l
    # => 1
    
  2. 入力が空のときは処理が実行されない

    : | xargs | wc -l
    # => 0
    
  3. 入力が空で--no-run-if-emptyオプションが指定されているときはエラーになる

    : | xargs --no-run-if-empty | wc -l
    # => xargs: illegal option -- -