Supprimer ^ C lorsque CTRL + C

25

Existe-t-il un moyen de supprimer ^Clorsque vous appuyez sur CTRL+ Cdans le shell include avec Red Hat Enterprise Linux 6 ("Santiago")? J'ai la permission de modifier le mien .bash_profile.

Fede Gold
la source
4
essayerset echo-control-characters off
Sundeep
1
J'ai essayé mais cela n'a pas fonctionné
Fede Gold

Réponses:

29

Modifiez (ou créez) votre ~/.inputrcfichier. Ajouter une ligne disant

set echo-control-characters Off

Cela demandera à la bibliothèque GNU Readline (que Bash utilise) de ne pas afficher (écho) de caractères de contrôle à l'écran. Le paramètre sera actif dans toutes les nouvelles sessions Bash par la suite (et dans tout autre utilitaire qui utilise la bibliothèque Readline).

Notez que si votre système Unix est livré avec un fichier de configuration à l'échelle du système pour la bibliothèque Readline (généralement /etc/inputrc), votre fichier de configuration personnel devra inclure ce fichier:

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

Une autre alternative consiste à faire une copie personnelle du fichier de configuration à l'échelle du système, puis à le modifier.

Kusalananda
la source
Salut, j'ai testé cela et son bon fonctionnement mais quand j'interromps une commande bash en cours d'exécution, cela n'a pas fonctionné, par exemple sleep 180et appuyez sur CTRL + C
rɑːdʒɑ
@ Ten-Coin Cela ne fonctionnera que si la commande utilise malheureusement la bibliothèque Readline.
Kusalananda
1
S'il ~/.inputrcn'existe pas déjà, la simple création du fichier peut entraîner la perte de certains paramètres existants. Dans mon cas, j'ai d'abord remarqué que ctrl + gauche et ctrl + droite avaient cessé de fonctionner. Le correctif était de commencer ma ~/.inputrcavec cette ligne $include /etc/inputrc. Il est également possible de juste cp /etc/inputrc .inputrcet de modifier comme vous le souhaitez.
kasperd
2
@kasperd Bon point! Je ne savais pas que l'ajout d'un fichier de configuration personnel désactiverait la lecture du fichier de configuration à l'échelle du système (mon système n'en a pas). Je mettrai à jour ma réponse.
Kusalananda
20

Essayez ce qui suit:

stty -echoctl

Pour une explication, voir cet excellent article détaillé de Stéphane Chazelas qui explique également quelques autres sttyfonctionnalités .

Si vous souhaitez rendre ce changement permanent (et que vous utilisez bashcomme impliqué dans votre question), il est préférable de le mettre .bashrccomme indiqué par jlmg dans les commentaires (il s'applique donc à tous les shells interactifs).

phk
la source
+1 Contrairement à la solution readline, cela devrait fonctionner pour la plupart sinon toutes les choses en cours d'exécution dans le terminal.
JoL
1
Il faut probablement mentionner qu'il ne fonctionnera pas sur tous les terminaux s'il .bash_profileest inséré car ce fichier n'est analysé que par les shells de connexion. Il doit être placé à la .bashrcplace, il est donc lu par toutes les invocations interactives.
JoL
1
Cela ne fera-t-il pas encore écho à l'octet brut 0x03, qui peut théoriquement être interprété par certains terminaux? Cela aura également des effets secondaires si vous faites des choses comme exécuter une commande non lisible, appuyer sur une touche fléchée déplacera le curseur sur l'écran plutôt que de le montrer^[[A
Random832
1
@ Random832 +1 Vous avez raison. Je suppose que ce paramètre est mal nommé; il ne contrôle pas l'écho des caractères de contrôle mais plutôt leur traduction en caractères imprimables avant l'écho. Pour éviter cet effet secondaire, vous devez stty -echoégalement le faire. Bien sûr, cela empêchera également l'écho de tout le reste, ce qui rend probablement cette réponse non valable si tout ce que vous vouliez était de cacher le ^Cs.
JoL
1
@jlmg Si ^Cc'était toujours à la fin, je pourrais être d'accord avec vous. Mais le ^Csera imprimé là où se trouvait le curseur, ce qui peut remplacer une paire de caractères n'importe où dans la commande. Cela signifie que si vous devez copier-coller des parties de cette commande, vous risquez de vous retrouver avec quelque chose de déformé. Et le ^Cn'est pas aussi facilement reconnu en regardant par-dessus le terminal qu'il l'aurait été s'il était à la fin de la commande.
kasperd
2

Si vous essayez de trouver une configuration qui permette un écho normal (y compris echoctl) et coupe simplement l'écho des caractères générateurs de signal, et vous êtes sûr que cela devrait être possible parce que vous l'avez vu fonctionner de cette façon auparavant ...

Vous l'avez probablement vu de cette façon. Mais ce n'est plus possible, à cause de ce commit :

validation ec5b1157f8e819c72fc93aa6d2d5117c08cdc961

Activez l'écho INTR / QUIT / SUSP dans la discipline de ligne N_TTY (par exemple, ctrl-C apparaîtra comme "^ C" si stty echoctl est défini et ctrl-C est défini comme INTR).

Linux semble être le seul système d'exploitation de type Unix (récemment, j'ai vérifié cela sur Solaris, BSD et Mac OS X) qui ne se comporte pas de cette façon, et cela me manque vraiment comme une bonne confirmation visuelle de l'interruption d'un programme dans la console ou xterm. Je m'en souviens aussi de nombreux Unix que j'ai utilisés au fil des ans. Apporter cela à Linux semble également être un bon moyen de le rendre encore plus conforme au comportement standard de type Unix.

Si vous vous souvenez bien de la façon dont Linux ne faisait pas écho à cela ^C, la seule façon de récupérer l'ancien comportement est de patcher votre noyau. Dans les versions récentes, l'écho des caractères générateurs de signal se trouve aux lignes 1215-1218 de drivers / tty / n_tty.c .


la source