(Linux)xargsのxの意味はexecuteかcrossか

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/

コメント

タイトルとURLをコピーしました