linux – 当完成函数读取文件时,Bash完成有时会对我的终端进行网格化
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了linux – 当完成函数读取文件时,Bash完成有时会对我的终端进行网格化,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1889字,纯文字阅读大概需要3分钟。
内容图文
所以我一直遇到一些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.
内容总结
以上是互联网集市为您收集整理的linux – 当完成函数读取文件时,Bash完成有时会对我的终端进行网格化全部内容,希望文章能够帮你解决linux – 当完成函数读取文件时,Bash完成有时会对我的终端进行网格化所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。