Qual è la differenza tra ^ C e ^ D per il terminale UNIX / Mac OS X?


62

Quando provo a fermare qualcosa, uso ^Ce talvolta ^Dnel terminale.

Qual è la differenza tra i due? Perché alcuni programmi non rispondono ^C, ma ^D. Perché Terminal.app si chiude quando uso ^D?


Cordiali saluti: Vedi le pagine di Wikipedia per: FINE DI TESTO carattere U + 0003 prodotto da Control + C e FINE DI TRASMISSIONE carattere U + 0004 prodotto da Control + D.
Basil Bourque,

Risposte:


61

CtrlCindica al terminale di inviare un SIGINTal processo in primo piano corrente, che per impostazione predefinita si traduce in chiusura dell'applicazione. CtrlDdice al terminale che dovrebbe registrare un EOF sull'input standard, che bash interpreta come un desiderio di uscire.


63

Ctrl+ D( ^D) indica la fine del file . Funziona solo all'inizio di una riga (sto semplificando un po ') e non ha alcun effetto se il programma non sta leggendo l'input dal terminale. Nel tuo esperimento, hai ^Ddetto alla shell che non avresti digitato più comandi, quindi è uscito; quindi il terminale è uscito perché il suo sottoprogramma era terminato.

Ctrl+ C( ^C) significa "interrompere", cioè interrompere ciò che stai facendo. Tecnicamente, premendo si ^Cinvia il segnale INT , che per impostazione predefinita termina un'applicazione, ma che in molti programmi significa tornare al livello superiore (ad esempio, in una shell, smettere di digitare una riga di comando e tornare a un prompt incontaminato).

Se un programma non risponde ^C, puoi provare Ctrl+ \( ^\). Questo invia il segnale QUIT , che per impostazione predefinita termina un'applicazione e che non molti programmi intercettano.

Un altro tasto che invia un segnale è Ctrl+ Z( ^Z). Invia il segnale TSTP , che mette in pausa il programma in primo piano. (TSTP è l'abbreviazione di "terminal stop"; è simile a STOP ma TSTP può essere ignorato mentre STOP non può.) Dalla shell, è possibile riprendere l'esecuzione di quel programma con il fgcomando (riprendi in primo piano) o il bgcomando (riprendi in sfondo).

Tutte queste chiavi possono essere modificate con il sttycomando. Alcuni programmi, in particolare i programmi a schermo intero con combinazioni di tasti, li disabilitano.


Una piccola correzione: Control-Z invia il segnale TSTP (arresto terminale). Questo può essere catturato o ignorato dai processi, mentre il segnale di STOP non può essere.
Chris Page

Ne avevo bisogno! era bloccato e non riuscivo a uscire
ahnbizcad

1
Solo un suggerimento riguardo a CTRL-D: significa "svuota l'input che ho digitato finora" e Se la riga è vuota, allora read () ritorna con zero e viene interpretato come "fine del file".
luca,

Questa è un'informazione super importante e utile; grazie per la spiegazione esauriente e chiara
iono

Solo per curiosità, perché il programma Python che viene eseguito nella shell non si chiude con ctrl + c, invece viene richiesto KeyboardInterrupt? Si chiude con ctrl + d (se all'inizio di una riga) e con ctrl + \.
Rick,

2

Aggiungendo alle 2 risposte davvero buone sopra, ecco un esempio:

Se digiti pythonnella shell, ti porta nel prompt >>> di python.

Ora, se colpisci Ctrl+C, dirà KeyboardInterrupte rimani nel >>>.
Se entri in un ciclo for, ad esempio digitando for x in (text):, aspetta che tu digiti ulteriormente mostrando un prompt ..., se premi Ctrl+Cora, uscirà dall'istruzione for e tornerà al prompt >>>
Se premi Ctrl+Din qualsiasi momento, sia in >>> o ... uscirà dal prompt di Python e tornerà alla shell originale.

Allo stesso modo, se inviato a un'altra macchina, a Ctrl+Cterminerà qualsiasi comando esistente, Ctrl+Dlo farà e uscirà anche dalla macchina. (Inoltre, la Deletechiave è la stessa di fare un Ctrl+D)


Apprezzo questa risposta Tuttavia, ho riscontrato alcune inesattezze quando l'ho provato da solo. Mentre veniva immesso in una macchina remota ed eseguiva il processo Python, Ctrl + D usciva da Python e mi riportava al prompt della macchina remota, ma non usciva dalla macchina. Inoltre, il tasto Canc non ha funzionato allo stesso modo di Ctrl + D, eseguendo python, al prompt remoto o al mio prompt locale. Non sembrava fare nulla, tranne in realtà eliminare i caratteri durante la digitazione in Python, ovviamente. Tuttavia, Ctrl + D ha agito come il tasto Elimina durante la digitazione, ha eliminato i caratteri.
Stack Underflow

1
È interessante, penso che potrebbe dipendere dal tipo di shell che stai usando (bash, ksh ecc.).
Siddhartha,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.