1 votes

Bash n'exécute pas la commande sur Ctrl+D

Dactylographie Ctrl+D quitte bash Shell comme prévu, mais seulement lorsque la ligne de commande est vide. Lorsqu'il y a quelque chose de tapé sur la ligne de commande, il est exécuté à la place comme si Enter a été pressé. Y a-t-il un moyen de faire en sorte qu'il sorte toujours ?

2voto

Kamil Maciorowski Points 57004

Normalement, la sortie de stty -a contient eof = ^D . Cela signifie que le terminal envoie EOF lorsque vous appuyez sur Ctrl + d . Bash utilise Readline et lorsqu'il n'y a aucun caractère sur la ligne et que le point est au début de la ligne, Readline l'interprète comme la fin de l'entrée, renvoie EOF et Bash sort.

Dans votre cas, cette fonctionnalité semble intacte.

Lorsque les conditions ne sont pas remplies, une liaison normale (le cas échéant) s'applique. Vérifiez la liaison avec

bind -p | grep -F '"\C-d'

Avec les liens par défaut, la sortie est "\C-d": delete-char . Et ceci :

bind -q accept-line

génère généralement

accept-line can be invoked via "\C-j", "\C-m".

Quand j'appuie sur Ctrl + v , Enter j'obtiens ^M ce qui signifie Enter est équivalent à Ctrl + m qui accepte la ligne. C'est le mécanisme. Je m'attends à ce que vous appreniez que dans votre cas Ctrl + d déclencheurs accept-line également. Cela expliquerait le comportement en question.

Une autre possibilité est que votre émulateur de terminal envoie ^J lorsque vous appuyez sur Ctrl + d y stty est configuré pour envoyer EOF sur ^J . Ce serait très inhabituel mais cela pourrait aussi reproduire le comportement.


Y a-t-il un moyen de faire en sorte qu'il sorte toujours ?

Oui. Maintenant, je suppose que votre émulateur de terminal envoie ^D lorsque vous appuyez sur Ctrl + d et le comportement inhabituel que vous avez signalé (exécution de la ligne) est uniquement dû à une liaison inhabituelle dans Readline.

Dans mon Bash, la liaison par défaut pour Ctrl + u es unix-line-discard cela clarifie la ligne. Je peux faire Ctrl + d envoyer Ctrl + u et Ctrl + d . Cela fonctionnera effectivement comme Ctrl + d lorsque la ligne est vide.

Dans Bash :

bind '"\C-d": "\C-u\C-d"'

Ou (solution permanente) dans votre ~/.inputrc (ou /etc/inputrc ) :

"\C-d": "\C-u\C-d"

Si vous souhaitez remplacer votre liaison inhabituelle par la liaison par défaut, invoquez la fonction

bind '"\C-d": delete-char'

mais cela n'affectera que le Shell dans lequel vous l'exécutez. Une solution permanente est de trouver où la liaison indésirable est définie et de supprimer la liaison. Cela peut être

  • sur ~/.inputrc ou /etc/inputrc (une ligne comme "\C-d": accept-line ),
  • ou dans ~/.bashrc ou /etc/bash.bashrc ou un autre fichier qui est sourcé (une ligne comme bind '"\C-d": accept-line' ).

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X