Wie leite ich eine durch Zeilenumbrüche getrennte Liste als Argumente an einen anderen Befehl weiter?

10

Ich habe also eine Liste von Benutzernamen wie:

user1
user2
user3

Ich möchte mich idauf jeden von ihnen bewerben und etwas bekommen wie:

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

Wie kann ich das erreichen? Bitte beachten Sie, dass die Liste die Ausgabe eines anderen Befehls ist mycommand.

Yukashima Huksay
quelle
Welche Eingabe mycommanderwartet? Oder ist mycommand ein Skript von Ihnen und Sie fragen, wie Sie ihm die Liste der Benutzernamen als Eingabe geben können? Bitte bearbeiten und klären.
Nachtisch
Es ist ein Skript von mir, das diese Liste als Ausgabe gibt
Yukashima Huksay

Antworten:

16

Verwendung xargs:

mycommand | xargs -L1 id

Beispiel:

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

Sie können die Eingabe auch in bash durchlaufen:

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

xargskonvertiert Eingaben in Argumente eines Befehls. Die -L1Option weist xargsan, jede Zeile als einziges Argument für einen Aufruf des Befehls zu verwenden.

Olorin
quelle
2
Wenn ich weiß, dass es sich um eine durch Zeilenumbrüche getrennte Zeile handelt und die Gefahr besteht, dass der Eingabestream Leerzeichen enthält, verwende ich '-d \ n' wie folgt: mycommand | xargs '-d\n' -L1 id Ziemlich immer eine gute Idee, zusammen mit dem richtigen "$ -Zitat" aller Shell Variablen.
Seth Robertson
@ SethRobertson sehr wahr. Ich habe das weggelassen -d '\n'und IFS= read -rda die Eingabe als Benutzernamen bezeichnet wird, hatte ich das Gefühl, dass es übertrieben sein könnte.
Olorin
Vielleicht klarer:echo -n "root nobody" | tr ' ' '\n' | xargs -L 1 id
Pablo Bianchi
3

Mit bash können Sie die Ausgabezeilen in einem Array erfassen:

mapfile -t lines < <(mycommand)

Und dann über sie iterieren

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

Dies ist nicht so prägnant wie xargs, aber wenn Sie die Zeilen für mehr als eine Sache benötigen, ist es ziemlich nützlich.

Glenn Jackman
quelle
Was bedeutet "<<"?
Yukashima Huksay
1
Die erste <ist die übliche Umleitung von mapfile's stdin. <(...)ist eine Prozesssubstitution - Prozesssubstitutionen sind sehr nützlich, um Probleme aufgrund von Pipelines zu vermeiden, die in Subshells ausgeführt werden.
Glenn Jackman