Rimuovere ^ C quando CTRL + C


25

C'è un modo per rimuovere ^Cquando si preme CTRL+ Cnella shell include con Red Hat Enterprise Linux 6 ("Santiago")? Ho il permesso di modificare il mio .bash_profile.


4
provareset echo-control-characters off
Sundeep il

1
Ci ho provato ma non ha funzionato
Fede Gold

Risposte:


29

Modifica (o crea) il tuo ~/.inputrcfile. Aggiungi una riga dicendo

set echo-control-characters Off

Questo indicherà alla libreria GNU Readline (che Bash usa) di non emettere (echo) alcun carattere di controllo sullo schermo. L'impostazione sarà attiva in seguito in tutte le nuove sessioni di Bash (e in qualsiasi altra utility che utilizza la libreria Readline).

Nota che se il tuo sistema Unix viene fornito con un file di configurazione a livello di sistema per la libreria Readline (di solito /etc/inputrc), il tuo file di configurazione personale dovrà includere quel file:

$include /etc/inputrc
set echo-control-characters Off

Un'altra alternativa è quella di creare una copia personale del file di configurazione dell'intero sistema e quindi modificarlo.


Ciao, ho provato questo e il suo funzionamento bene, ma quando interrompo un comando bash in esecuzione non ha funzionato, ad esempio sleep 180e premere CTRL + C
rɑːdʒɑ

@ Ten-Coin Funzionerà solo se il comando usa purtroppo la libreria Readline.
Kusalananda

1
Se ~/.inputrcnon esiste già, la semplice creazione del file potrebbe perdere alcune impostazioni esistenti. Nel mio caso ho notato per la prima volta che ctrl + sinistra e ctrl + destra avevano smesso di funzionare. La correzione era iniziare il mio ~/.inputrccon questa linea $include /etc/inputrc. È anche possibile cp /etc/inputrc .inputrcmodificarlo e modificarlo come desiderato.
Kasperd,

2
@kasperd Ottimo punto! Non ero a conoscenza del fatto che l'aggiunta di un file di configurazione personale avrebbe disabilitato la lettura del file di configurazione a livello di sistema (il mio sistema non ne ha uno). Aggiornerò la mia risposta.
Kusalananda

20

Prova quanto segue:

stty -echoctl

Per una spiegazione, vedi questo fantastico e dettagliato post di Stéphane Chazelas che spiega anche alcune altre sttycaratteristiche .

Se vuoi rendere permanente quel cambiamento (e stai usando bashcome implicito nella tua domanda) allora è meglio metterlo nel tuo .bashrccome notato da jlmg nei commenti (quindi si applica a tutte le shell interattive).


+1 Contrariamente alla soluzione readline, questo dovrebbe funzionare per la maggior parte, se non per tutte le cose in esecuzione nel terminale.
JoL

1
Uno dovrebbe probabilmente menzionare che non funzionerà su tutti i terminali se messo in .bash_profilequanto quel file è analizzato solo dalle shell di login. Dovrebbe essere inserito .bashrcinvece, quindi viene letto da tutte le invocazioni interattive.
JoL

1
Non riecheggerà ancora il byte 0x03 non elaborato, che teoricamente può essere interpretato da alcuni terminali? Avrà anche effetti collaterali se si eseguono operazioni come l'esecuzione di un comando non readline, premendo un tasto freccia si sposta il cursore sullo schermo anziché mostrarlo^[[A
Casuale 832

1
@ Random832 +1 Hai ragione. Immagino che l'impostazione abbia solo un nome sbagliato; non controlla l'eco dei personaggi di controllo, ma piuttosto la loro traduzione in caratteri stampabili prima dell'eco. Per evitare questo effetto collaterale, dovresti farlo stty -echoanche tu . Questo ovviamente impedirà anche l'eco di tutto il resto, il che probabilmente rende questa risposta un no-go se tutto ciò che volevi era nascondere la ^Cs.
JoL

1
@jlmg Se ^Cfosse sempre alla fine potrei essere d'accordo con te. Ma ^Cverrà stampato ovunque sia stato il cursore, che può sovrascrivere una coppia di caratteri in qualsiasi punto del comando. Ciò significa che se hai bisogno di copiare e incollare parti di quel comando potresti finire con qualcosa di mutilato. E ^Cnon è facilmente riconoscibile quando si guarda al terminale come sarebbe stato se fosse alla fine del comando.
Kasperd,

2

Se stai cercando di trovare una configurazione che consenta l'eco normale (incluso echoctl) e taciti l'eco dei caratteri che generano il segnale, e sei sicuro che dovrebbe essere possibile perché l'hai visto funzionare così prima ...

Probabilmente l'hai visto in quel modo. Ma non è più possibile, a causa di questo commit :

commit ec5b1157f8e819c72fc93aa6d2d5117c08cdc961

Attiva l'eco INTR / QUIT / SUSP nella disciplina della riga N_TTY (ad es. Ctrl-C apparirà come "^ C" se è impostato stty echoctl e ctrl-C è impostato come INTR).

Linux sembra essere l'unico sistema operativo unix-like (recentemente l'ho verificato su Solaris, BSD e Mac OS X) che non si comporta in questo modo, e mi manca davvero come una buona conferma visiva dell'interruzione di un programma nella console o xterm. Lo ricordo con affetto da molti Unix che ho usato anche negli anni. Portare questo su Linux sembra anche un buon modo per renderlo ancora più conforme al comportamento standard simile a unix.

Se vi ricordate con affetto come Linux utilizzato per non eco che ^C, l'unico modo per ottenere il vecchio comportamento è di nuovo una patch per il kernel. Nelle versioni recenti, l'eco dei caratteri generatori di segnale è alle righe 1215-1218 di drivers / tty / n_tty.c .

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.