xargsコマンド
A | xargs B
と書いた時、
A
の stdout
を、
B
の stdin
としてではなく、(これが通常のpipe)
B
の 引数
として実行したい時に使う
xargs [オプション] コマンド [コマンドの引数]
具体例など
複数引数であることがわかり易い例
例えば、以下のような2ファイルがあるとき
$ 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に名前をつけて、 右
の引数の順序を指定できる
参考
ややこしいポイント
型がない

e.g. $ ghq list --full-path | fzf | xargs code
ghqをfzfで選んでvscodeで開く
cdなどのbuil-inなコマンドとは組合わられない
processの問題
こういうのは無理
e.g. $ ghq list --full-path | fzf | xrags cd
代わりに cd $(ghq list --full-path | fzf)
とすればいい