在bash中,在将一个命令绑定到某个键后,没有回显正在执行的命令

问题描述:

首先,您可以参考这个伟大的帖子:Bash bind以更好地理解我想实现的目标。在bash中,在将一个命令绑定到某个键后,没有回显正在执行的命令

我要实现的是,当我按下回车,然后更新壳动态提示,现在我已经是:

__update_shell_prompt() { 
    # according what I had done in the terminal regenerate the new shell prompt 
    # new_shell_prompt 
    export PS1=$new_shell_prompt 
} 

bind '"\C-M":"\n__update_shell_prompt\n"' 

它能正常工作,只是每个命令后,我执行它其实与文本__update_shell_prompt也一样:

enter image description here

我也试图通过这样的-x选项使用bind

bind -x '"\C-M":"\n__update_shell_prompt\n"''

然后,它不尊重\n,所以它完全不工作,如果我删除了\n,它仍然无法正常工作,而在另一带来严重的问题,我试着命令只执行停留在屏幕上,并永远不会得到执行,就像这样:所有的命令只是卡住那里...

enter image description here

所以:

  1. 我怎样才能使不回显命令文本...
  2. 如果这不是正确的方法来实现这一点(输入命中时动态更新shell提示),那么我应该怎么做?
+0

@丹尼斯威廉姆森如果你还在那里,那将会有很大的帮助。 – lnshi

+0

关于交互式使用(而不是脚本)的问题通常更适合[Unix SE](https://unix.stackexchange.com/)或[SuperUser](https://superuser.com/)。 –

+0

@CharlesDuffy哦,谢谢你,你有这个解决方案吗? – lnshi

首先感谢@Charles Duffy,我遵循他的建议并使用了tput

解决方法很简单,用tput cup来移动光标,然后用tput el删除线,如下图所示:

# Get the current cursor coordinate. 
IFS=';' read -sdR -p $'\E[6n' ROW COL; local current_row=`echo "${ROW#*[}"` 

# Move the cursor up then delete that line 
tput cup $((current_row-2)) 0 && tput el 

提示:

  1. 为了防止潜在的命令历史污染,您可以将export HISTCONTROL=ignorespace放入您的~/.bash_profile~/.bashrc;

  2. 然后调用带前缀space的命令。

我用这个场景解决的问题可以在这里参考:docker-machine PR #4127