web-dev-qa-db-ja.com

改行で区切られたリストを別のコマンドの引数としてパイプするにはどうすればよいですか?

だから私は次のようなユーザー名のリストを持っています:

user1
user2
user3

それらのそれぞれにidを適用し、次のようなものを取得します。

uid=100(user1) gid=5(g1) groups=5(g1),6(g6),7(g10)
.
.

どうすればこれを達成できますか?リストはmycommandなどの別のコマンドの出力であることに注意してください。

7

xargs を使用します。

mycommand | xargs -L1 id

例:

$ (echo root; echo nobody) | xargs -L1 id
uid=0(root) gid=0(root) groups=0(root)
uid=65534(nobody) gid=65534(nogroup) groups=65534(nogroup)

Bashで入力をループすることもできます。

mycommand | while read line
do
    id "$line"
done

xargsは、入力をコマンドの引数に変換します。 -L1オプションは、xargsに、各行をコマンド呼び出しの唯一の引数として使用するように指示します。

15
Olorin

Bashを使用すると、出力の行を配列にキャプチャできます。

mapfile -t lines < <(mycommand)

そして、それらを繰り返します

for line in "${lines[@]}"; do
    id "$line"
done

これはxargsほど簡潔ではありませんが、複数の行を必要とする場合には非常に便利です。

3
glenn jackman