键入内容Ctrl+D会按预期退出 bash shell,但仅当命令行为空时才会退出。当在命令行上键入内容时,它会被执行,就像Enter按下了一样。有没有办法让它总是退出?
答案1
通常 的输出stty -a
包含。这意味着当您按下+eof = ^D
时,终端会发送 EOF。Bash使用 Readline,当行上没有字符并且 point 位于行首时,Readline 会将其解释为输入的结束,返回 EOF 并且 Bash 退出。Ctrld
就您而言,此功能似乎完好无损。
当条件不满足时,将应用常规绑定(如果有)。使用以下方法检查绑定:
bind -p | grep -F '"\C-d'
使用默认绑定,输出为"\C-d": delete-char
。如下所示:
bind -q accept-line
通常产生
accept-line can be invoked via "\C-j", "\C-m".
当我按下Ctrl+时v,Enter我得到^M
的结果Enter相当于Ctrl+m接受该行。这就是机制。我希望您了解在您的案例中Ctrl+d也会触发accept-line
。这将解释所讨论的行为。
另一种可能性是,您的终端仿真器^J
在您按下Ctrl+时发送d,并stty
设置为在 时发送 EOF ^J
。这将非常不寻常,但它也可以复制该行为。
有没有办法让它始终退出?
是的。现在我假设您的终端仿真器^D
在您按下Ctrl+时发送消息d,并且您报告的异常行为(执行该行)只是由于 Readline 中的异常绑定。
Ctrl在我的 Bash 中, +的默认绑定u是unix-line-discard
,这会清除该行。我可以使Ctrl+d发送Ctrl+u 和 Ctrl+ 。当行为空时,这将有效地起到+ 的d作用。Ctrld
在 Bash 中:
bind '"\C-d": "\C-u\C-d"'
或者(永久解决方案)在您的~/.inputrc
(或/etc/inputrc
):
"\C-d": "\C-u\C-d"
如果你想将不常见的绑定更改为默认绑定,请调用
bind '"\C-d": delete-char'
但这只会影响你运行它的 shell。永久的解决方法是找到不需要的绑定的定义位置并删除该绑定。它可能
- 在
~/.inputrc
或/etc/inputrc
(类似这样的行"\C-d": accept-line
), - 或者在
~/.bashrc
或者/etc/bash.bashrc
或者另一个获取源的文件中(类似这样的行bind '"\C-d": accept-line'
)。