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 ?
Réponse
Trop de publicités?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 commebind '"\C-d": accept-line'
).