linux – 当完成函数读取文件时,Bash完成有时会对我的终端进行网格化
作者:互联网
所以我一直遇到一些cli程序的问题.有时当我使用Ctrl C终止正在运行的进程时,它会使终端处于奇怪的状态(例如,关闭回声).现在,在许多情况下都可以预料到,因为杀死一个进程并不能让它有机会恢复终端的状态.但我发现,对于许多其他情况,bash完成是罪魁祸首.例如,尝试以下操作:
>按如下所示启动新的bash会话:bash –norc以确保不加载任何完成.
>定义一个完成函数:_completion_test(){grep -q foo / dev / null;返回1; }.
>定义使用上述函数的完成:完成-F _completion_test rlwrap.
>输入以下内容:r l w r a p Space c a t Tab Enter(即rlwrap cat后跟Tab,然后按Enter键).
>等待一秒钟,然后使用Ctrl C终止该过程.
>终端的回声应该没有关闭.因此,如果您键入任何字符,它将不会被终端回显.
真正奇怪的是,如果我从完成函数中删除看似无害的grep -q foo / dev / null,一切都能正常工作.事实上,将grep -q foo / dev / null(甚至更简单的东西,如cat / dev / null)添加到我的系统中安装的任何完成函数,都会导致同样的问题.我还使用不使用readline和没有Ctrl C的程序重现了这个问题(例如,查找/ varTab | head,并为find定义了上述完成).
为什么会这样?
编辑:只是为了澄清,上面是一个人为的例子.实际上,我想要做的更像是这样的:
_completion_test() {
if grep -q "$1" /some/file; then
#do something
else
#do something else
fi
}
有关更具体的示例,请尝试以下操作:
_completion_test() {
if grep -q foo /dev/null; then
COMPREPLY=(cats)
else
return 1
fi
}
但仅仅是我调用grep这一事实导致了这个问题.我不明白为什么我不能在这种情况下调用grep.
解决方法:
嗯,答案很简单;这是一个bug:
This happens when a programmable completion function calls an external command during the execution of a completion function. Bash saves the tty state after every successful job completes, so it can restore it if a job is killed by a signal and leaves the terminal in an undesired state. In this case, we need to suppress that if the job that completes is run during programmable completion, since the terminal settings at that time are as readline sets them for line editing. This fix will be in the release version of bash-4.4.
标签:bash,shell,linux,bash-completion 来源: https://codeday.me/bug/20190711/1430055.html