Jak wyjść lub anulować złe polecenie bash?

41

Spodziewam się trochę za to, ale nigdzie nie mogę znaleźć odpowiedzi. Wygląda na to, że powinno to być takie oczywiste. Czasami, gdy wpisuję złe polecenie w terminalu bash, kursor po prostu przeskakuje do następnego wiersza bez żadnego błędu lub czegokolwiek. Nie umiem powiedzieć, co zrobiłem źle. To tak, jakbym utknął w programie. Rekonstrukcja:

$ tidy

Ja: „Ups! Nie to chciałem napisać…”

:q

Ja: „To nie działało ...”

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

Wiem, że spieprzyłem, ale jak wrócić do monitu bez zamykania terminala?

David Kennedy
źródło
Powiązane: Co powoduje wysyłanie różnych sygnałów?
Gilles „SO- przestań być zły”
:qfaktycznie pracował dla mnie; czy to nie jest polecenie Vima?
The Red Pea,

Odpowiedzi:

53

Zawsze można spróbować oczywistych rzeczy jak ^C, ^D(EOF), Ucieczka itp, ale jeśli wszystko zawiedzie I zazwyczaj kończy się zawieszenie polecenie z ^Z(Control-Z), która stawia mnie z powrotem do zbiornika.

Następnie wykonuję pspolecenie i zapisuję PID (identyfikator procesu) polecenia, a następnie wydaje polecenie kill thePID( kill -9 thePIDjeśli poprzednie nie działało), aby zakończyć aplikację.

Zauważ, że nie jest to schludny (nie zamierzony gra słów) sposób na zakończenie działania aplikacji / polecenia i istnieje ryzyko, że nie zachowasz niektórych danych itp.

Przykład (użyłbym, tidyale nie mam go zainstalowanego):

$ 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
źródło
8
Otóż ​​to!! ^ Z na ratunek. Dziękuję bardzo.
David Kennedy,
3
^ \ (ctrl-backslash, SIGQUIT) działa w niektórych upartych narzędziach, które nie reagują na ^ C.
mrb
2
Ciii! Nie mów ludziom o ^ \ albo zaczną SIG_IGNto robić, to co zrobimy?
Alan Curry,
1
@godlygeek Czy możesz mi powiedzieć, co oznacza %% w Linuksie lub co to takiego? Dużo szukałem.
Noumenon
1
@Noumenon, spójrz na LESS='+/^JOB CONTROL' man bash. %%odnosi się do „bieżącej pracy”.
Wildcard,
12

Spróbuj nacisnąć Ctrl- Dlub Ctrl- C. Jeśli to się nie powiedzie, zabij proces.

Próbowanie z tidypoleceniem, o którym wspomniałeś, Ctrl- Ddziała.

Renan
źródło
CTRL+Cjest również dobry dla Windows CMD.
T.Todua
7

Innym rozwiązaniem (jeszcze nie wspomnianym) jest wysłanie SIGQUITsygnału za pomocą ctrl+\

Jest silniejszy niż ctrl+c

Gilles Quenot
źródło
2

CTRL+D == exit shell command

i

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

Oczywiście produkują one, kernel signaljeśli chcesz dowiedzieć się więcej, przeczytaj:

man 7 signal
Zatoka Perska
źródło
3
Ctrl + D jest na końcu pliku, a nie bezpośrednio kończy działanie.
Gilles „SO- przestań być zły”