我如何查看制表符完成返回的内容?
我澄清一下:
假设我打开一个 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 补全显示的内容呢?
最佳答案
Tab 完成是 readline 模式的一部分。如果您同时处于交互模式和 TTY 上,您只会获得 readline 模式。因此,当您 Popen
它时,它的标准输入是一个管道,您无法完成制表符。
您可以通过在不使用 Python 的情况下进行测试来了解这一点:
$ socat TCP-LISTEN:12345 EXEC:bash &
$ nc localhost 12345
l<TAB>
没有任何反应。您可能会在 L
之后看到 ^I
,或者 7 个空格,或者什么都没有,但您不会完成任何事情。
当然你可以强制交互模式,但它只会打开 /dev/tty
并忽略你的 stdin 管道,这没有帮助。
因此,您需要做的是使用 pty
模块或 openpty
或 forkpty
函数而不是 subprocess
。它远没有那么好和高级,但它确实可以工作。
当然,一旦您开始阅读 bash 的 TTY 输出,您也会开始收到终端蜂鸣声和光标移动字符;我希望你准备好处理这个问题。
更好的解决方案是不要尝试在 bash 中发送制表符,只需使用 compgen
以编程方式为您完成事情:
completions = subprocess.check_output('compgen -c l', shell=True).splitlines()
-c
意味着您只需要命令名称。您可以完成一大堆事情——目录、文件名、环境变量等,任何可以在交互式提示上的任何上下文中完成的事情。如果您想要在空命令行开头完成的完全相同的事情,我相信那是 -abc -A function
(别名、内置命令、命令和函数),但请阅读文档完整的细节。
关于Python - 如何查看制表符完成输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25758576/