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
inothemo
quelle
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.


quelle
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 .

dmckee
quelle
+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.

Ryan C. Thompson
quelle
+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.

Tamara Wijsman
quelle
+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
Doug Harris
quelle
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