xargsというコマンドは標準入力で与えられた改行区切りのテキストを、スペース区切りの引数に変換して、次のコマンドの引数へ渡すコマンドです。
フィルタ前
takk~$ seq 10 1 2 3 4 5 6 7 8 9 10
xargsでフィルタ後
takk~$ seq 10 | xargs echo 1 2 3 4 5 6 7 8 9 10
フィルタ結果だけを見ると、縦に並んでいた1〜10が、xargsによって横に並び直しされています。
縦を横にするので、xargsのxは、cross(X)を表現していると思ってました。
しかし、manによるとeXecuteのようです。
takk$ man xargs NAME xargs - build and execute command lines from standard input
xargsの目的は、標準入力を元にして、コマンドラインの組み立てと実行を行うことにあります。
組み立て方は様々です。bannerコマンドの結果をxargsでつなげる例を見てみます。
takk~$ banner HELLO | tr '\n' '\0' | xargs -0 printf "|%-39s|\n" |# # ####### # # #######| |# # # # # # #| |# # # # # # #| |####### ##### # # # #| |# # # # # # #| |# # # # # # #| |# # ####### ####### ####### #######| | | takk~$
printfはC言語のprintfと同様で、書式付き文字列を出力するコマンドです。
上記の例では、%-39sを指定することで39文字の左寄せ文字列を生成しています。
次にtrコマンドでは’\n’ ‘\0’を指定することで、改行をヌル文字に置換しています。
なぜこのような置換をしているのでしょう。
bannerの結果は多くの空白を含んでいますので、元々が空白だったのか改行だったのか区別が付きません。
このように空白を区切り文字として使用したくない場合、xargsは、-0オプションを指定することで、空白の代わりにヌル文字を区切り文字とすることができます。
bannerの結果も改行をヌル文字に変換してからxargsに渡すことで、最終的にprintfへの引数としてヌル文字区切りの文字列が組み立てされるのです。
関連記事はコチラ
https://life-is-command.com/linux-command-beginner/
コメント