Wie kann ich einen fehlerhaften Bash-Befehl beenden oder abbrechen?

41

Ich erwarte ein bisschen Flak dafür, aber ich kann die Antwort nirgendwo finden. Es scheint, als sollte es so offensichtlich sein. Wenn ich in einem Bash-Terminal einen fehlerhaften Befehl eingebe, springt der Cursor manchmal ohne Fehler oder irgendetwas in die nächste Zeile. Ich kann nicht sagen, was ich falsch gemacht habe. Es ist, als würde ich im Programm stecken bleiben. Nachstellung:

$ tidy

Ich: "Ups! Das wollte ich nicht tippen ..."

:q

Ich: "Das hat nicht funktioniert ..."

:exit
:quit
exit
quit
/exit
/quit
-exit
-quit
-wtf???

Ich weiß, dass ich es vermasselt habe, aber wie kann ich zur Eingabeaufforderung zurückkehren, ohne das Terminal zu schließen?

David Kennedy
quelle
Verwandte: Wodurch werden verschiedene Signale gesendet?
Gilles 'SO- hör auf böse zu sein'
:qarbeitete tatsächlich für mich; Ist das nicht ein Vim-Befehl?
Die rote Erbse

Antworten:

53

Sie können immer versuchen , die offensichtlichen Dinge wie ^C, ^D(EOF), Flucht usw., aber wenn alle Stricke ich in der Regel den Befehl am Ende Aussetzung mit ^Z(Strg-Z) , die bringt mich in die Schale zurück.

Ich mache dann einen psBefehl und notiere die PID (Prozess-ID) des Befehls und gebe dann einen kill thePID( kill -9 thePIDfalls der erstere nicht funktioniert hat) Befehl aus, um die Anwendung zu beenden.

Beachten Sie, dass dies keine ordentliche (kein Wortspiel beabsichtigte) Möglichkeit ist, die Anwendung / den Befehl zu beenden, und Sie das Risiko eingehen, dass möglicherweise einige Daten usw. nicht gespeichert werden.

Ein Beispiel (ich hätte verwendet, tidyaber ich habe es nicht installiert):

$ gnuplot

    G N U P L O T
    Version 4.2 patchlevel 6 
     ....
    Send bug reports and suggestions to <http://sourceforge.net/projects/gnuplot>

Terminal type set to 'wxt'
gnuplot> 
gnuplot>               #####  typed ^Z here
[1]+  Stopped                 gnuplot
$ ps
  PID TTY          TIME CMD
 1681 pts/1    00:00:00 tcsh
 1690 pts/1    00:00:00 bash
 1708 pts/1    00:00:00 gnuplot
 1709 pts/1    00:00:00 ps


$ kill 1708            ###### didn't kill the command as ps shows

$ ps
  PID TTY          TIME CMD
 1681 pts/1    00:00:00 tcsh
 1690 pts/1    00:00:00 bash
 1708 pts/1    00:00:00 gnuplot
 1710 pts/1    00:00:00 ps
$ kill -9 1708           ### -9 did the trick
$ 
[1]+  Killed                  gnuplot

$ ps
  PID TTY          TIME CMD
 1681 pts/1    00:00:00 tcsh
 1690 pts/1    00:00:00 bash
 1711 pts/1    00:00:00 ps
Levon
quelle
8
Das ist es!! ^ Z zur Rettung. Ich danke dir sehr.
David Kennedy
3
^ \ (Strg-Backslash, SIGQUIT) funktioniert in einigen hartnäckigen Dienstprogrammen, die nicht auf ^ C reagieren.
mrb
2
Schh! Erzählen Sie den Leuten nichts von dem SIG_IGN, sonst fangen sie auch damit an. Was werden wir dann tun?
Alan Curry
1
@godlygeek Kannst du mir sagen, was %% unter Linux bedeutet oder was es ist? Ich habe viel gesucht.
Noumenon
1
@Noumenon, schau mal LESS='+/^JOB CONTROL' man bash. %%bezieht sich auf den "aktuellen Job".
Wildcard
12

Versuchen Sie es mit Ctrl- Doder Ctrl- C. Wenn es fehlschlägt, beenden Sie den Prozess.

Der Versuch , mit dem tidyBefehl , den Sie erwähnt Ctrl- Dfunktioniert.

Renan
quelle
CTRL+Cist auch gut für Windows CMD.
T.Todua
7

Eine andere (nicht erwähnte) Lösung besteht darin, das SIGQUITSignal mit ctrl+ zu senden\

Es ist stärker als ein ctrl+c

Gilles Quenot
quelle
2

CTRL+D == exit shell command

und

CTRL+ C == terminate the current process, Of course may be the given software handle it and CTRL+D doens't work

Natürlich produzieren sie eine, kernel signalwenn Sie mehr wissen wollen, lesen Sie:

man 7 signal
Persischer Golf
quelle
3
Strg + D beendet die Datei, nicht direkt.
Gilles 'SO- hör auf böse zu sein'