2016-11-15 4 views
3

Ich habe den folgenden Befehl bekam:Wie führe ich den Befehl für jede Stdin-Zeile aus?

$ cmd-a | while read -r line; do echo "${line}"; cmd-b; done 

Das funktioniert gut, und wird für alle Absichten und Zwecke aussehen cmd-a ist genauso normal seine stdout Druck, sondern für jede Zeile führen wir cmd-b auch.

Gibt es einen saubereren Weg, dies zu tun?

cmd-a | xargs -n1 cmd-b wäre schön, aber es teilt sich auf alle Leerzeichen (weiß ich GNU xargs hat die -d Option, aber es ist leider nicht mir zur Verfügung), und würde die Ausgabe von cmd-a unterdrücken.

+0

@JohnKugelman guten Punkt, danke! Du hast recht, ich will, dass die Ausgabe von cmd-a in stdout geschrieben wird und die Ausgabe von cmd-b. Ich werde die Frage aktualisieren, um klarer zu sein. –

+0

@anubhava nicht sicher, was du meinst. Ich weiß, was Prozesssubstitution ist, aber wie würden Sie es in diesem Fall anwenden? –

+0

'während IFS = Lese-r Zeile; echo "$ {line}"; cmd-b; done <<(cmd-a) ' – anubhava

Antwort

6

Der bestehende Vorschlag ist völlig idiomatisch und sauber; BashFAQ #001 empfiehlt genau den gleichen Mechanismus, um zeilenweise über die Eingabe zu iterieren. Es gibt keinen Grund, es zu ersetzen, aber wenn Sie es häufig verwenden, kann es sinnvoll sein, es zu kapseln.

Betrachten Sie die folgende Funktion:

for_each_line() { 
    while IFS= read -r line; do 
    printf '%s\n' "$line" 
    line=$line "[email protected]" 
    done 
} 

... danach laufen wie:

cmd-a | for_each_line cmd-b 

... oder, wenn Ihr cmd-b ist eine Funktion, und Sie wollen es in der Lage sein, zu modifizieren, Schale Zustand kann die oben wie folgt (pro BashFAQ #24) aufgerufen werden:

for_each_line cmd-b < <(cmd-a) 

..., die die vorherige Zeile für cmd-b in der Umgebung verfügbar macht, sollte sie einen Grund haben, ihr Verhalten basierend auf dem Wert derselben zu modifizieren.

+0

Solide Antwort - sehr verpflichtet! –

+1

Ein Fehler - mein ursprünglicher Code verwendete 'echo' anstelle von' printf'.Das bedeutet, dass bei bash laufenden Aktienoptionen eine Zeile mit nur "-n" verschwinden würde; dass eine Bash mit der Option 'xpg_echo' aktiviert ist, könnte sich anders verhalten; und dass auf anderen POSIX-y-Shells [das Verhalten war extrem schlecht definiert] (http://pubs.opengroup.org/onlinepubs/009695399/utilities/echo.html) - siehe insbesondere den Abschnitt APPLICATION USAGE des verknüpften Standarddokument. In geeigneter Weise geändert. –

Verwandte Themen