Kiedy próbuję coś zatrzymać, używam, ^C
a czasem ^D
w terminalu.
Jaka jest różnica między nimi? Dlaczego niektóre programy nie reagują ^C
, ale ^D
. Dlaczego Terminal.app po prostu kończy pracę, gdy używam ^D
?
Kiedy próbuję coś zatrzymać, używam, ^C
a czasem ^D
w terminalu.
Jaka jest różnica między nimi? Dlaczego niektóre programy nie reagują ^C
, ale ^D
. Dlaczego Terminal.app po prostu kończy pracę, gdy używam ^D
?
Odpowiedzi:
CtrlCmówi terminalowi, aby wysłał SIGINT
do bieżącego procesu pierwszego planu, co domyślnie przekłada się na zakończenie aplikacji. CtrlDmówi terminalowi, że powinien zarejestrować EOF na standardowym wejściu, co bash interpretuje jako chęć wyjścia.
Ctrl+ D( ^D
) oznacza koniec pliku . Działa tylko na początku linii (trochę upraszczam) i nie działa, jeśli program nie odczytuje danych wejściowych z terminala. W swoim eksperymencie ^D
powiedz powłoce, że nie zamierzasz pisać więcej poleceń, więc zakończyło się; następnie terminal wyszedł, ponieważ jego podprogram zakończył się.
Ctrl+ C( ^C
) oznacza „przerwać”, tzn. zatrzymać to, co robisz. Technicznie, naciśnięcie ^C
wysyła sygnał INT , który domyślnie kończy aplikację, ale co w wielu programach oznacza powrót na najwyższy poziom (np. W powłoce, przestań pisać wiersz poleceń i powróć do nieskazitelnego monitu).
Jeśli program nie odpowiada ^C
, możesz spróbować Ctrl+ \( ^\
). To wysyła sygnał QUIT , który domyślnie kończy aplikację i który nie przechwytuje tak wielu programów.
Kolejnym kluczem wysyłającym sygnał jest Ctrl+ Z( ^Z
). Wysyła sygnał TSTP , który wstrzymuje działanie programu na pierwszym planie. (TSTP to skrót od „terminal stop”; jest podobny do STOP, ale TSTP można zignorować, a STOP nie.) Z poziomu powłoki można wznowić wykonywanie tego programu za pomocą fg
polecenia (wznowienie na pierwszym planie) lub bg
polecenia (wznowienie w tło).
Wszystkie te klucze można zmienić za pomocą stty
polecenia. Niektóre programy, szczególnie programy pełnoekranowe, które mają przypisania klawiszy, wyłączają je.
KeyboardInterrupt
? Kończy się, naciskając ctrl + d (jeśli jest na początku wiersza) i ctrl + \.
Dodając do 2 naprawdę dobrych odpowiedzi powyżej, oto przykład:
Jeśli wpiszesz python
powłokę, pojawi się pytanie >>> w pythonie.
Teraz, jeśli uderzysz Ctrl+C
, powie KeyboardInterrupt
i pozostanie w >>>.
Jeśli wejdziesz w pętlę for, np. Wpisując for x in (text):
, czeka ona na dalsze pisanie przez wyświetlenie monitu ..., jeśli Ctrl+C
teraz naciśniesz , wyjdzie z instrukcji for i powróci do monitu >>>
Jeśli naciśniesz Ctrl+D
w dowolnym momencie, czy w >>>, czy ... wyjdzie z monitu python i powróci do oryginalnej powłoki.
Podobnie, jeśli ssh'ed na innym komputerze, a Ctrl+C
przerwie wszelkie istniejące polecenia, Ctrl+D
zrobi to i wyjdzie również z komputera. (Również Delete
klucz jest taki sam jak robienie a Ctrl+D
)