Bash 不执行 Ctrl+D 上的命令

Bash 不执行 Ctrl+D 上的命令

键入内容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+时vEnter我得到^M的结果Enter相当于Ctrl+m接受该行。这就是机制。我希望您了解在您的案例中Ctrl+d也会触发accept-line。这将解释所讨论的行为。

另一种可能性是,您的终端仿真器^J在您按下Ctrl+时发送d,并stty设置为在 时发送 EOF ^J。这将非常不寻常,但它也可以复制该行为。


有没有办法让它始终退出?

是的。现在我假设您的终端仿真器^D在您按下Ctrl+时发送消息d,并且您报告的异常行为(执行该行)只是由于 Readline 中的异常绑定。

Ctrl在我的 Bash 中, +的默认绑定uunix-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')。

相关内容