xargsを使う際には`echo`は書かなくてもよいことをmanページから知った

Bash

はじめに

小さなことですが、 xargsman ページを見ていて気づいたことが 2つ ありました。

検証環境

$ bash -version | head -n 1
GNU bash, version 4.2.46(2)-release (x86_64-redhat-linux-gnu)

$ xargs --version | head -n 1
xargs (GNU findutils) 4.5.11

man ページの一部抜粋

一部抜粋します。
以下のようなことが書いてありました。

xargs reads items from the standard input, delimited by blanks (which can be protected with double or single quotes or a backslash) or newlines,
and executes the command (default is /bin/echo) one or more times with any initial-arguments followed by items read from standard input.

今回学んだことは2点。

  • xargsに渡すパラメータの情報はダブルクォートやシングルクォートでグループ化できる
  • xargsで実行するコマンドを明示しなかった場合は echo コマンドが利用される

試してみます。

xargsに渡すパラメータの情報はダブルクォートやシングルクォートでグループ化できる

標準入力から情報を1つずつ受け取って、 echo させてみます。
( -n 1 オプションを指定すれば、標準入力から受け取るパラメータを1つずつにできます。 )

$ echo a b c d | xargs -n 1 echo
a
b
c
d

ここで、 "a" と "b" だけはひとまとめに処理させたい場合にはシングルクォートあるいはダブルクォートで囲んでやることでグルーピングできるということです。
やってみます。

$ echo "a b" c d | xargs -n 1 echo
a
b
c
d

上記の方法では echo の実行結果からダブルクォートが除去されてしまうため、もう一括り外側で囲んでやる必要があります。

$ echo '"a b"' c d | xargs -n 1 echo
a b
c
d

シングルクォートとダブルクォートの位置を入れ替えても同様の結果が取得できます。

$ echo "'a b'" c d | xargs -n 1 echo
a b
c
d

xargsで実行するコマンドを明示しなかった場合は echo コマンドが利用される

これがびっくりしました。
実は echo コマンドを実行させたい場合は明示しなくても良いそうです。

$ echo a b c d | xargs -n 1
a
b
c
d

確かに echo を書かなくても動作していますね。
コードゴルフ の際には大きな武器になります。

ひとこと

xargs は読み進めるともっと便利な機能、きっとあると思う。

Bash