Wie führe ich einen Befehl nach dem aktuellen Befehl in Bash aus?


18

Ich lade die Datei mit wget herunter und möchte meinen Computer ausschalten, nachdem der Download abgeschlossen ist, aber ich muss jetzt irgendwohin gehen :) Ist es möglich, den Befehl in bash genau auszuführen, wenn der Vorgang abgeschlossen ist?

Ich weiß, dass das funktioniert:

wget http://example.com/file.rar; jetzt herunterfahren

Aber was ist, wenn ich nur tippe:

wget http://example.com/file.rar

2
Erwägen Sie die Verwendung von && und || Anstatt von ;. && und || Überprüfen Sie den Rückgabewert des vorherigen Befehls, bevor Sie den nächsten Befehl ausführen. Falls wget fehlschlägt, möchten Sie möglicherweise nicht herunterfahren.
KFro

Antworten:


31

Sie können so etwas tun:

  1. Stoppen Sie die Ausführung von wget mit Strg-Z (es ist nicht gestoppt, es ist ausgesetzt)
  2. stelle es in den Hintergrund (bg)
  3. laufe: warte; Herunterfahren -h jetzt

wait wartet auf alle im Hintergrund ausgeführten Programme der aktuellen Shell - also dieses wget.

Nachdem das Warten beendet ist, wird der Computer heruntergefahren.


Vergiss nicht, deine wget-Instanz in den Vordergrund zu stellen, wenn du fertig bist. Wenn wget bereits läuft, können Sie es mit ^ z (Strg-z) in den Vordergrund stellen.
Andrew Scagnelli

4
Keine Notwendigkeit, es sei denn, Sie möchten die Fortschrittsanzeige wirklich sehen.
dmckee

Keine Notwendigkeit, da er die Maschine sich selbst überlässt und dann herunterfährt.
Wolf

11

In einer anderen Shell verwenden

ps -u <your username> | grep wget

um die PID des Befehls zu finden, auf den Sie warten möchten

wait <PID>; shutdown -h now

Damit wird das Herunterfahren erst ausgeführt, wenn der Prozess beendet ist. Siehe auch die Antwort von depesz .


+1, nur eine Anmerkung: Funktioniert waitnur für Befehle, die von derselben Shell
gestartet wurden

4

Meine Lösung lautet wie folgt: Unterbrechen Sie Ihre lang laufende Aufgabe mit Strg + Z und geben Sie dann Folgendes ein:

fg; echo "Done!"

Wenn Sie ausführen möchten, um je nach Erfolg oder Misserfolg Ihres Befehls anders zu reagieren, verwenden Sie && und || als Kurzschlussbetreiber.

fg && echo "Success!" || echo "Failure!"

BEARBEITEN: Dies funktioniert nicht mit sudo, da Sie nach Ihrem Passwort gefragt werden. Dementsprechend habe ich die Beispiele mit sudo entfernt. Wenn Sie sudo für die zweite Aufgabe benötigen, wenden Sie eine andere der hier angegebenen Methoden an.

Andererseits glaube ich, dass sowohl GNOME als auch KDE Möglichkeiten bieten, ein Herunterfahren / einen Neustart ohne Verwendung von sudo auszulösen, indem ein entsprechendes D-Bus-Signal oder etwas gesendet wird.


+1 für fg..., sudokönnte aber ein Problem sein, wenn Sie zur Eingabe eines Passworts
aufgefordert werden

Hmm. Ja, ich habe diesen Trick nicht verwendet, um Dinge zu sudoen, wenn etwas zu Ende ist. Für sudo bräuchten Sie einen anderen Trick. Ich werde meinen Beitrag entsprechend bearbeiten.
Ryan C. Thompson

Für meine Zwecke ist diese Antwort überlegen, da sie den Prozess automatisch wieder in den Vordergrund rückt
Cookie

Außerdem können Passwörter für sudo deaktiviert werden (pro Benutzer und pro Befehl) - wenn der Benutzer dies einmal über sudo beenden darf, kann er dies möglicherweise immer tun. Ein feindliches Herunterfahren ist in einigen Fällen möglicherweise nicht so gefährlich - schon gar nicht so gefährlich wie ein kompromittierter Gastzugriff auf einem laufenden Computer.
Cookie

1

Ja, geben Sie einfach Ihren zweiten Befehl ein und drücken Sie die Eingabetaste. Wenn in Ihrem aktuellen Programm Text gescrollt wird, können Sie nicht sehen, was Sie richtig eingeben. Achten Sie also auf Ihre Tasten, damit Sie es richtig machen.

Eine intelligentere Möglichkeit besteht darin, zu einem anderen TTY zu wechseln (STRG + ALT + F1 bis F6) und den Befehl gleichzeitig auszuführen. Wenn Sie ein Befehlszeilenprogramm wie screen verwenden, können Sie darin ein neues Fenster erstellen.


+1 für die erste Option. Ich verstehe leider nicht, wie die zweite Option funktionieren soll.
Uhr

Wenn Sie beispielsweise STRG + ALT + F2 drücken, gelangen Sie zu einer neuen zweiten Konsole, in der Sie sich anmelden und einen Befehl eingeben können. Auf diese Weise können Sie dort einen zweiten Befehl ausführen. Zweitens können Sie, wenn Sie den Bildschirm herunterladen (ein Programm, mit dem Sie Ihre Konsole ausgefallener verwenden können), einen zweiten Tab / ein zweites Fenster öffnen, in dem Sie erneut Befehle eingeben können, ohne sich erneut anmelden zu müssen. Da Sie es jedoch gleichzeitig benötigen, können Sie bei Option 1 bleiben. Ich glaube, es gibt keinen anderen Weg, um den gleichen Effekt zu erzielen. Es sei denn, Sie verwenden ein anderes TTY / Fenster, um durch ein Skript zu prüfen, ob der Prozess noch ausgeführt wird. :-P
Tamara Wijsman

Verwenden Sie die Warte-PID aus dmckees Antwort
Cookie

1

Wenn Sie Lust bekommen möchten, überprüfen Sie den Rückgabestatus des wget und fahren Sie es nur herunter, wenn es erfolgreich war.

% wget http://example.com/file.rar
% if [ $? -eq 0 ]
> then
> shutdown now
> fi

2
Dies ist ein guter Ansatz beim wgetErstellen von Skripten. Während der Ausführung werden Sie jedoch nicht aufgefordert, den Test zu erstellen.
dmckee

Sie können dies mit meinem Control-Z- und fg-Trick kombinieren, um das zu umgehen.
Ryan C. Thompson
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.