Python或Bash打印输出到命令行,准备执行
我正试图编写一个Python或Bash脚本,将Bash命令直接输出到命令行(即,好像我刚刚键入它,然后可以按enter键执行它)Python或Bash打印输出到命令行,准备执行,python,bash,bash-completion,Python,Bash,Bash Completion,我正试图编写一个Python或Bash脚本,将Bash命令直接输出到命令行(即,好像我刚刚键入它,然后可以按enter键执行它) 如何以这种方式输出命令?使用BASH,您可以使用select builtin命令轻松地进行输出。这里有一个很好的例子:我认为这在bash中是不可能的。但是,可以在bash4或更高版本中通过使用read内置并立即使用eval执行输入来模拟提示符功能的合理子集: $ read -ei "ls -l"; eval "$REPLY" 隐式行延续不可用,例如,如果以|结尾行;
如何以这种方式输出命令?使用BASH,您可以使用select builtin命令轻松地进行输出。这里有一个很好的例子:我认为这在
bash
中是不可能的。但是,可以在bash
4或更高版本中通过使用read
内置并立即使用eval执行输入来模拟提示符功能的合理子集:
$ read -ei "ls -l"; eval "$REPLY"
隐式行延续不可用,例如,如果以|
结尾行;您需要显式地提供行继续字符,并且下一行还将插入初始文本,因此您必须在继续之前清除行。通过查看屏幕
或tmux
完成类似操作。下面是Bash中在tmux
下运行的概念证明:
print_to_cmd_line() {
printf '%s' "$*" | tmux load-buffer -
tmux paste-buffer -d
}
从Python中使用它的一种方法是将内容管道化到bash(当然,您也可以通过subprocess.Popen()
)运行相关的bash脚本):
…在bash中,要读取NUL分隔的输入并编写eval-safe命令:
#!/usr/bin/bash
arr=()
while IFS= read -r -d '' entry
arr+=( "$entry" )
done
printf '%q ' "${arr[@]}"
printf '\n'
…然后,将它们绑在一起:
./python-gen-cmd | ./bash-gen-cmd
…将在标准输出上为您提供一个安全的命令,可以通过SSH连接进行复制、粘贴或发送。即使您的命令包含不可打印的字符或类似的奇怪字符,这也能起作用。如果您使用Python,您可以在仍然使用Python的情况下执行命令。我通过快速搜索找到了这一点,因此您应该能够找到有关如何执行的足够信息。谢谢,但我希望将其输出到bash命令行,以便在选择执行它时可以通过按enter键来执行它。我也知道如何在bash中实现您的建议。我希望命令输出到命令行,而不是执行。为什么它需要在命令行上?为什么不让程序打印命令并在运行命令之前等待用户输入(如果您不想运行命令,这将允许您取消程序)?对于那些熟悉zsh
的人,他正在寻找print-z
提供的功能。您需要阅读。您能举个例子吗?看起来这不是我想要的你发送的链接;do echo“命令:$Command,按执行或停止”;阅读$指挥部;别告诉我我在找什么。我希望命令直接写入bash命令行。-I
?是否打算将其设置为-r
?否-i
与-e
一起使用,在接受行之前,可以使用readline
编辑该行的默认值。我讨论了是否在本例中也包括-r
,并决定不允许显式行继续。我在linux设备上获得了-I选项,但在Mac上没有:/Mac上唯一的选项是:code-read:用法:read[-ers][u fd][t timeout][p prompt][a array][n nchars][d delim name…]
正如我在回答中所说,这需要版本4或更高版本;Mac OS X随附3.2,但您可以使用类似于自制的东西安装最新版本。也许您的登录shell是/usr/local/bin/bash
(或者是bash
4.2的其他路径),您可以从使用/bin/bash
的脚本中看到错误?您发布的用法字符串来自3.2。
#!/usr/bin/bash
arr=()
while IFS= read -r -d '' entry
arr+=( "$entry" )
done
printf '%q ' "${arr[@]}"
printf '\n'
./python-gen-cmd | ./bash-gen-cmd