在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
也一样:
我也试图通过这样的-x
选项使用bind
:
bind -x '"\C-M":"\n__update_shell_prompt\n"''
然后,它不尊重\n
,所以它完全不工作,如果我删除了\n
,它仍然无法正常工作,而在另一带来严重的问题,我试着命令只执行停留在屏幕上,并永远不会得到执行,就像这样:所有的命令只是卡住那里...
所以:
- 我怎样才能使不回显命令文本...
- 如果这不是正确的方法来实现这一点(输入命中时动态更新shell提示),那么我应该怎么做?
答
首先感谢@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
提示:
为了防止潜在的命令历史污染,您可以将
export HISTCONTROL=ignorespace
放入您的~/.bash_profile
或~/.bashrc
;然后调用带前缀
space
的命令。
我用这个场景解决的问题可以在这里参考:docker-machine PR #4127。
@丹尼斯威廉姆森如果你还在那里,那将会有很大的帮助。 – lnshi
关于交互式使用(而不是脚本)的问题通常更适合[Unix SE](https://unix.stackexchange.com/)或[SuperUser](https://superuser.com/)。 –
@CharlesDuffy哦,谢谢你,你有这个解决方案吗? – lnshi