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

4

我想编写一个Python或Bash脚本,以直接将Bash命令输出到命令行(即好像我只是键入了它并且可以按Enter执行它)。

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


如果您使用Python,您可以在仍然在Python中执行命令的情况下完成它。我通过快速搜索找到了这个链接https://dev59.com/DG445IYBdhLWcg3wpL5_,因此您应该能够找到足够的信息来完成它。 - Rob Watts
1
谢谢,但我想将其输出到Bash命令行,以便在选择执行它时可以通过按Enter来执行它。 我也知道如何在Bash中执行您建议的操作。 我希望将命令输出到命令行,而不是执行它。 - RCCola
为什么需要在命令行上运行?为什么不让程序打印命令并等待用户输入,然后再运行命令(这样可以允许您取消程序,如果您不想运行该命令)? - Rob Watts
1
对于那些熟悉 zsh 的人,他正在寻找 print -z 提供的功能。 - chepner
1
您需要阅读BashFAQ/050 - Adrian Frühwirth
显示剩余3条评论
4个回答

3

我不认为这在bash中是可能的。 然而,使用read内置函数,并立即使用eval执行输入,可以在bash 4或更高版本中模拟提示符功能的合理子集:

$ read -ei "ls -l"; eval "$REPLY"

隐式行连续不可用,例如,如果您使用|结束该行,则需要明确提供行连续字符,并且下一行也将插入初始文本,因此您需要在继续之前清除该行。


“-i”?这是想要输入“-r”吗? - William Pursell
2
不需要;-i-e 一起使用,可以在行上放置默认值,在接受该行之前可以使用 readline 进行编辑。我曾经考虑过在这个例子中是否也包括 -r,但最终决定不包括它,以允许显式的行继续。 - chepner
我在我的Linux系统上可以使用-i选项,但是在我的Mac上却没有 :/ Mac上的唯一选项是: code read: usage: read [-ers] [-u fd] [-t timeout] [-p prompt] [-a array] [-n nchars] [-d delim] [name ...] - RCCola
2
正如我在答案中所说,这需要4或更高版本;Mac OS X附带的是3.2,但您可以使用Homebrew之类的工具安装最新版本。 - chepner
GNU bash,版本4.2.45(2)-release(i386-apple-darwin13.0.0),我的Bash版本看起来还不错吧? - RCCola
2
也许您的登录 shell 是 /usr/local/bin/bash(或某个替代路径到 bash 4.2),并且您从使用 /bin/bash 的脚本中看到了错误?您发布的用法字符串来自 3.2 版本。 - chepner

0

vim-slime 通过使用 screen 或者 tmux 来实现类似的功能。这是一个在 tmux 下运行的 Bash 的概念验证:

print_to_cmd_line() {
    printf '%s' "$*" | tmux load-buffer -
    tmux paste-buffer -d
}

0
cmd=( ls -l "hello world" )                # given an array as input
printf '%q ' -v cmd_quoted "${cmd[@]}"     # transform it to an eval-safe string
echo "Run the following: $cmd_quoted"      # ...which can then be run by the user

在Python中使用它的一种方法是将内容管道传输到bash(当然,您也可以通过subprocess.Popen()运行相关的bash脚本):

#!/usr/bin/env python
import sys 
cmd=['ls', '-l', 'hello world']
for element in cmd:
  sys.stdout.write('%s\0' % element)

...而在bash中,为了读取该NUL分隔的输入并编写一个eval安全命令:

#!/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连接发送。即使您的命令包含非可打印字符或类似的奇怪字符,这也能正常工作。


0

1
你能给个例子吗?从你发的链接看,好像不是我想要的。 - RCCola
在“ls -l”、“echo foo”和“df”中选择命令;执行以下语句:echo "Command: $command, press <ENTER> to execute or <CTRL+C> to stop",然后按回车键执行命令,或按CTRL+C停止。 - Magno Torres
还不是我想要的。我希望命令可以直接写入到Bash命令行中。 - RCCola

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接