web-dev-qa-db-fra.com

Comment puis-je diriger une liste séparée par une nouvelle ligne sous forme d'arguments vers une autre commande?

J'ai donc une liste de noms d'utilisateur tels que:

user1
user2
user3

Je veux appliquer idsur chacun d'eux et obtenir quelque chose comme:

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

Comment puis-je atteindre cet objectif? Veuillez noter que la liste est le résultat d'une autre commande, nommée mycommandname__.

7
yukashima huksay

Utilisez xargs :

mycommand | xargs -L1 id

Exemple:

$ (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)

Vous pouvez aussi faire une boucle sur l'entrée dans bash:

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

xargs convertit l'entrée en arguments d'une commande. L'option -L1 indique à xargs d'utiliser chaque ligne comme unique argument pour un appel de la commande.

15
Olorin

Avec bash, vous pouvez capturer les lignes de sortie dans un tableau:

mapfile -t lines < <(mycommand)

Et puis itérer sur eux

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

Ce n'est pas aussi concis que xargs, mais si vous avez besoin de lignes pour plus d'une chose, c'est plutôt utile.

4
glenn jackman