如何查看哪些标签完成返回?
不清楚地说明:
让我们说我打开一个bash shell,键入l
并单击TAB。
我会获取包含l
字符的所有命令。
现在,我知道如何以编程方式向shell输入完整命令并解析输出
例如:
def shell_output()
p = subprocess.Popen(command,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
print iter(p.stdout.readline, '')
但我怎样才能看到TAB的完成情况?
答案 0 :(得分:2)
制表符完成是readline模式的一部分。如果您处于交互模式和TTY,则只能获得readline模式。所以,当你Popen
时,它的stdin是一个管道,你就无法完成标签。
你可以通过以下方式测试而不用Python:
$ socat TCP-LISTEN:12345 EXEC:bash &
$ nc localhost 12345
l<TAB>
什么都没发生。您可能会在^I
或7个空格后看到L
,或者根本没有看到任何内容,但是您无法完成所有任务。
当然你可以强制使用交互模式,但是它只会打开/dev/tty
并忽略你的stdin管道,这对你没用。
因此,您需要做的是使用pty
模块或openpty
或forkpty
函数而不是subprocess
。它不是那么好和高级别,但实际上会有效。
当然,一旦你开始阅读bash的TTY输出,你就会开始得到终端的哔哔声和光标移动字符;我希望你准备好处理这个问题。
更好的解决方案是不要尝试在bash上发送标签,只需使用compgen
以编程方式为您完成任务:
completions = subprocess.check_output('compgen -c l', shell=True).splitlines()
-c
表示您只需要命令名称。您可以完成大量的事情 - 目录,文件名,env变量等,可以在交互式提示的任何上下文中完成的任何事情。如果你想要在空命令行开头完成相同的事情,我相信-abc -A function
(别名,内置函数,命令和函数),但请阅读文档以获取完整的详细信息。