Jaka jest różnica między ^ C a ^ D dla terminala UNIX / Mac OS X?

61

Kiedy próbuję coś zatrzymać, używam, ^Ca czasem ^Dw 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?

prosseek
źródło
FYI: Zobacz strony w Wikipedii: END OF TEXT znak U + 0003 produkowany przez Control + C oraz END OF TRANSMISSION znak U + 0004 produkowany przez Control + D.
Basil Bourque,

Odpowiedzi:

60

CtrlCmówi terminalowi, aby wysłał SIGINTdo 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.

Ignacio Vazquez-Abrams
źródło
62

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 ^Dpowiedz 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 ^Cwysył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ą fgpolecenia (wznowienie na pierwszym planie) lub bgpolecenia (wznowienie w tło).

Wszystkie te klucze można zmienić za pomocą sttypolecenia. Niektóre programy, szczególnie programy pełnoekranowe, które mają przypisania klawiszy, wyłączają je.

Gilles „SO- przestań być zły”
źródło
Mała korekta: Control-Z wysyła sygnał TSTP (terminal stop). Proces ten może wychwycić lub zignorować, podczas gdy sygnał STOP nie może.
Chris Page
Potrzebowałem tego! utknął i nie mogłem się wydostać
ahnbizcad
1
Sugestia dotycząca CTRL-D: oznacza „opróżnij wpisane do tej pory dane wejściowe”, a jeśli linia jest pusta, to read () zwraca zero, i jest to interpretowane jako „koniec pliku”.
luca,
To bardzo ważna i pomocna informacja; dzięki za wyczerpujące i jasne wyjaśnienie
iono
Ciekawe, dlaczego progam Pythona działający w powłoce nie wychodzi z Ctrl + C, zamiast tego wyświetla monit KeyboardInterrupt? Kończy się, naciskając ctrl + d (jeśli jest na początku wiersza) i ctrl + \.
Rick
2

Dodając do 2 naprawdę dobrych odpowiedzi powyżej, oto przykład:

Jeśli wpiszesz pythonpowłokę, pojawi się pytanie >>> w pythonie.

Teraz, jeśli uderzysz Ctrl+C, powie KeyboardInterrupti 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+Cteraz naciśniesz , wyjdzie z instrukcji for i powróci do monitu >>>
Jeśli naciśniesz Ctrl+Dw 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+Cprzerwie wszelkie istniejące polecenia, Ctrl+Dzrobi to i wyjdzie również z komputera. (Również Deleteklucz jest taki sam jak robienie a Ctrl+D)

Siddhartha
źródło
Doceniam tę odpowiedź. Znalazłem jednak pewne niedokładności, gdy sam to wypróbowałem. Podczas gdy ssh'ed na maszynę zdalną i uruchamia proces python, Ctrl + D wyszedł z pythona i zabrał mnie z powrotem do monitu na komputerze zdalnym, ale nie wyszedł z maszyny. Ponadto klawisz Delete nie działał tak samo jak Ctrl + D w żadnym przypadku, uruchamiając Python, w zdalnym wierszu poleceń lub w wierszu poleceń lokalnych. Wydawało się, że nic nie robi, z wyjątkiem usuwania znaków podczas pisania w Pythonie, oczywiście. Jednak Ctrl + D działał jak klawisz Delete podczas pisania, usuwając znaki.
Przepełnienie stosu
1
To ciekawe, myślę, że może zależeć od rodzaju używanej powłoki (bash, ksh itp.).
Siddhartha