xargsコマンド
stdinを引数(複数)に変換し、実行する
A | xargs Bと書いた時、
Aのstdoutを、
Bのstdinとしてではなく、(これが通常のpipe)
Bの引数として実行したい時に使う
引数とstdinの違いがわかっていないと理解できないmrsekut.icon
xargs [オプション] コマンド [コマンドの引数]
xargsとpipeの違い
具体例など
複数引数であることがわかり易い例
例えば、以下のような2ファイルがあるとき
code:a1.txt
hoge1
code:a2.txt
hoge2
$ ls a*.txt | xargs catと実行すると、
$ cat a1.txt a2.txtのように、catに2引数渡して呼んだのと同じ
a*.txtの数が100個あっても、一気に渡されることになる
この数が多すぎるとエラーになることがある
その場合は、-Lなどを使って分割することができる
options
-L <number>
コマンドに渡す複数引数の上限値を指定する
e.g. $ seq 10 | xargs -L 5 echo
echo 1 2 3 4 5とecho 6 7 8 9 10が2回に分けて実行される
-P <number>
並列実行する数を指定する
-Lと併用する
e.g. $ seq 10 | xargs -L 5 -P 2 echo
echo 1 2 3 4 5とecho 6 7 8 9 10を並列に実行する
-I
左のstdoutに名前をつけて、右の引数の順序を指定できる
xargs のオプションいろいろ - Qiita
参考
/mrsekut-book-4797372281/394 (xargs)
#WIP
ややこしいポイント
引数とstdinの違い
引数とstdinの両方を入力に取るものと、片方のみ取るものとある
型がないmrsekut.icon
https://www.atmarkit.co.jp/ait/articles/1801/19/news014.html
e.g. $ ghq list --full-path | fzf | xargs code
ghqをfzfで選んでvscodeで開く
cdなどのbuil-inなコマンドとは組合わられない
processの問題
https://superuser.com/questions/206789/using-xargs-to-cd-to-a-directory
こういうのは無理
e.g. $ ghq list --full-path | fzf | xrags cd
代わりにcd $(ghq list --full-path | fzf)とすればいい