Python或Bash打印输出到命令行,准备执行

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" 隐式行延续不可用,例如,如果以|结尾行;

我正试图编写一个Python或Bash脚本,将Bash命令直接输出到命令行(即,好像我刚刚键入它,然后可以按enter键执行它)


如何以这种方式输出命令?

使用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