So reagieren Sie auf die Ausgabe eines fehlgeschlagenen Befehls

So reagieren Sie auf die Ausgabe eines fehlgeschlagenen Befehls

Mögliches Duplikat:
Was ist der einfachste Weg, Text aus dem Tail in der Befehlszeile auszuführen?

Ich hatte angenommen, dass die Ausgabe eines Befehls, dessen Ausführung fehlschlägt, an die Standardausgabe gesendet und somit weitergeleitet werden sollte. Anscheinend liege ich falsch, also korrigieren Sie mich bitte.

Zum Beispiel,

$easy_install
The program 'easy_install' is currently not installed.  You can install it by typing:
sudo apt-get install python-setuptools

Wenn ich also mit dem vorgeschlagenen Befehl installieren möchte, habe ich versucht

$easy_install | grep sudo | bash

d.h. naiv, die letzte Zeile herauszupicken und als Befehl an die Shell zu senden. Ich habe sogar versucht

$easy_install | tail -1 | bash

aber bekomme den gleichen Klappentext, ohne dass etwas passiert. Was mache ich falsch?

Antwort1

Da es sich bei der betreffenden Zeile um einen Befehl handelt, fällt mir folgender einfachste Weg ein:

`$easy_install 2>&1 | grep sudo`

Die Backticks $(…)nehmen die Ausgabe einer Befehlspipeline und führen sie aus, als ob Sie sie eingegeben hätten, und geben die Ausgabe zurück.

Bitte beachten Sie, dass dieser Befehl nicht funktioniert, wenn Sie ihn nicht installiert haben sudound versuchen, ihn zu installieren. Da es sich aber offensichtlich um Ubuntu handelt, sudoist er normalerweise verfügbar. Um dies zu vermeiden, sollten Sie Ihre zweite Möglichkeit ausprobieren:

`$easy_install 2>&1 | tail -n 1`

Versuchen Sie, sich die Verwendung von abzugewöhnen tail -1, es wird durch die Standardform ersetzt tail -n 1. Ich finde das selbst schwierig, aber ich mag keine Veraltungswarnungen. :)

Warnung: Wenn$easy_install existiertund Sie erhalten diese Art von Ausgabe nicht, dann sind beide Befehle einfestSicherheitsrisiko. Sie können am Ende willkürliche Dinge ausführen. Sie können sich schützen, indem Sie extravaganter vorgehen:

`$easy_install 2>&1 >/dev/null | grep '^sudo apt-get install'`

Dadurch wird verworfen stdoutund es wird nur alles ausgeführt, sudo apt-get installdas mit beginnt. Dies begrenzt die Dinge zwar schön, ist aber erheblich lästiger, als einfach sudo apt-get install $packageselbst einzutippen.

Antwort2

Fehlerausgaben werden normalerweise an die Standardfehlerausgabe und nicht an die Standardausgabe gesendet. Sie können dies durch Hinzufügen von verhindern 2>&1.

$ easy_install 2>&1 | grep sudo

Allerdings verwenden sie hierfür eine Shell-Funktion und ich vermute, dass eine kleine Änderung dieser Funktion es ihr ermöglichen würde, Sie zu fragen und die Aufgabe dann selbst auszuführen.

verwandte Informationen