Il terminale è in esecuzione quando lo apriamo.
luvpreet@DHARI-Inspiron-3542:/$
L'ho appena aperto. Quindi, quando premo Ctrl+ C, perché non si uccide da solo e chiude il terminale ??
Il terminale è in esecuzione quando lo apriamo.
luvpreet@DHARI-Inspiron-3542:/$
L'ho appena aperto. Quindi, quando premo Ctrl+ C, perché non si uccide da solo e chiude il terminale ??
Risposte:
Ctrl+ Cè il segnale di interruzione. Quando lo digiti in un terminale, bash invia SIGINT al lavoro in primo piano. Se non c'è lavoro (come succede quando hai appena aperto un terminale), non succede nulla. Il programma di emulazione terminale non è un lavoro in esecuzione nella shell, quindi non riceve il segnale e non si chiude.
Se vuoi chiudere il terminale con un tasto di controllo, usa Ctrl+ D(EOF) che fa uscire bash (e chiude anche il terminale).
Vedi anche: Guida per principianti di Bash sui segnali e in modo più approfondito Come funziona la gestione dei segnali
: questa risposta è stata modificata da quando sono stati pubblicati i commenti
bashche terminerà alcun programma quando si preme ctrl-c. Dirà semplicemente al kernel quale gruppo di processi è attivo e il kernel genererà un segnale a quel gruppo di processi quando riceve ctrl-c dal programma terminale.
La ^Csequenza di tasti, come altre sequenze di tasti *, non è magica, ma invia un codice a qualunque programma si concentri. (In X, il codice chiave è 54 per il Ccon un modificatore di 0x4 per Ctrl.) Il programma che sta ricevendo il flusso di chiavi è responsabile di fare qualcosa di appropriato con loro - ricorda che in molte applicazioni della GUI, la sequenza di tasti copia negli appunti.
Quando un emulatore di terminale GUI (ad es. Konsole) o un terminale virtuale riceve una sequenza di tasti che interpreta come ^C, può fare una delle tre cose. Se il terminale è in modalità raw , il programma in esecuzione ha chiesto al terminale di non eseguire alcuna gestione dei tasti speciali e di passarli direttamente al programma. Alcuni programmi che supportano funzionalità avanzate come l'editing di linee ricevono input da tastiera in alcune configurazioni tra sequenze di tasti non elaborate complete e righe di testo elaborate; bash, ad esempio, riceve i tasti uno alla volta. ^Cviene interpretato dal terminale, ma la chiave backspace viene inviata così com'è alla shell.
La maggior parte dei programmi, tuttavia, utilizza la modalità di cottura (perché non è raw), in cui il terminale interpreta alcune sequenze di tasti di base prima di inviarle effettivamente al programma (ecco perché è possibile utilizzare backspace in cat). In questa modalità, il terminale stesso traduce la ^Csequenza di tasti in un SIGINTsegnale e lo invia al processo figlio. Poiché il terminale ha generato il segnale, non verrà confuso e terminato.
Ctrl+ Alt+ Deletenel mondo di Windows, dove la combinazione di tasti è abbastanza vicina alla magia (può essere usata per far funzionare Windows, è piuttosto magico in sé e per sé!), Poiché è codificata nel sistema per interrompere e sovrascrive praticamente tutto, abbastanza simile a SysRqquello in quel senso.
cbreak/ -icanon, ma lascia la isigmodalità impostata e riceve segnali reali quando si premono i tasti associati. Gestisce SIGINTcomportandosi come descritto (non solo annulla la modifica delle righe, ma annulla anche qualsiasi comando interno che potrebbe essere in esecuzione in un ciclo) e ignora completamente SIGTSTPe SIGQUIT. Altri programmi, come vi, potrebbero non esserlo.
Ctrl+ Alt+ Deleteera ancora più magico di quanto non sia oggi - blogs.msdn.microsoft.com/oldnewthing/20140912-00/?p=44083 . Sebbene io sia una persona di Linux nel cuore, sono spesso considerevolmente stupito dalla misura in cui Windows è andato a rendere le cose facili da usare e logiche con risorse così limitate nei primi giorni.
^cnon ucciderà il gestore delle finestre :). Non sono in grado di commentare il personaggio crudo / cotto alla volta, ma la risposta è precisa su come sta generando quella sequenza di tastiSIGINT
^Cviene solitamente mappato (vedi stty -a) al SIGINTsegnale (vedi man 7 signal).
Un imprevisto SIGINTinterrompe il processo in esecuzione, MA ...
SIGINT è uno dei segnali per cui un processo può specificare il comportamento ("Catturare un segnale").
Quello che chiami "il terminale" prende SIGINTe torna al lavoro.
Quando ero un principiante mi mancava la parte che quando stavo usando la riga di comando stavo effettivamente usando due programmi separati, un terminale e una shell (ad esempio bash)
La shell è ciò che probabilmente già conosci, un programma che accetta come comandi di input o script, li esegue e stampa il loro output.
Il terminale dall'altra parte è come un uomo nel mezzo tra l'utente e un programma (il cui programma è di solito una shell come bash o pesce). Quello che fa il terminale è leggere l'input, ad esempio dalla tastiera, magari elaborare quell'input in qualche modo e reindirizzarlo all'altro programma (bash).
Anche questo funziona anche nell'altro modo, quando l'altro programma emette qualcosa, quel qualcosa viene reindirizzato al terminale, quindi è compito del terminale trasmettere quel qualcosa allo schermo. Tra ottenere l'input e stamparlo sullo schermo, il terminale può interpretare l'input che riceve in vari modi.
Ad esempio se un programma genera la seguente sequenza:
\e[0;31m some extra foobar text
Il terminale emetterà sullo schermo "del testo extra foobar" con lettere colorate rosse. Questo perché il terminale sceglie di trattare quel codice strano in un modo speciale che lo suggerisce per stampare il seguente output in rosso.
Allo stesso modo quando l'utente preme Ctrl - C, l'unica cosa speciale è che il terminale sceglie di trattarlo in un modo speciale, non c'è niente di speciale in questa sequenza di tasti. Nello specifico, ciò suggerisce di inviare il segnale di interruzione (SIGINT) al processo in esecuzione all'interno del terminale, ovvero la shell. Se in quel momento esiste un programma che è stato generato dalla shell ed è attualmente in esecuzione in primo piano, riceve anche il segnale. Ora la shell ha un gestore speciale per questo segnale e non succede nulla. Ma la maggior parte dei programmi ha i gestori predefiniti che nel caso di SIGINT sono appena usciti.
Ad ogni segnale è associata un'azione predefinita. L'azione predefinita per un segnale è l'azione che uno script o un programma esegue quando riceve un segnale.
Ctrl+ Cinvia il segnale di "interruzione" ( SIGINT ), che per impostazione predefinita termina il processo sul lavoro in esecuzione in primo piano.
Ctrl+ Ddice al terminale che dovrebbe registrare un EOF su input standard, che bash interpreta come un desiderio di uscire .
Un processo può scegliere di ignorare il segnale INT e Bash lo fa quando è in esecuzione in modalità interattiva.
Dal manuale :
Quando bash è interattivo, in assenza di trappole, ignora SIGTERM (in modo che uccidere 0 non uccida una shell interattiva) e SIGINT viene catturato e gestito (in modo che l'attesa di attesa sia interrompibile). In tutti i casi, bash ignora SIGQUIT. Se il controllo lavoro è attivo, bash ignora SIGTTIN, SIGTTOU e SIGTSTP.
trap è una funzione integrata nella shell che risponde ai segnali hardware e ad altri eventi. Definisce e attiva i gestori da eseguire quando la shell riceve segnali o altre condizioni speciali.
trap [-lp] [arg] [sigspec …]
-lstampa un elenco di nomi dei segnali e dei loro numeri corrispondenti.
-pvisualizza i comandi trap associati a ciascun SIGNAL_SPEC.arg deve essere letto ed eseguito quando la shell riceve il segnale sigspec. Ogni sigspec è un nome di segnale o un numero di segnale. I nomi dei segnali non fanno distinzione tra maiuscole e minuscole e il prefisso SIG è facoltativo.
Se un sigspec è 0 o EXIT , arg viene eseguito all'uscita della shell. Per capirlo, chiudi il terminale e aprilo dopo aver modificato la seguente riga nel .bashrcfile.
trap 'notify-send "Ctrl D pressed"' 0
Ctrl D è simile al exitcomando per uscire dal terminale.
Se vuoi che Bash esca alla ricezione del segnale INT, anche in modalità interattiva, puoi aggiungere quanto segue a ~/.bashrc:
trap 'exit' INT
o
trap 'exit' 2