我想编写一个Python或Bash脚本,以直接将Bash命令输出到命令行(即好像我只是键入了它并且可以按Enter执行它)。
如何以这种方式输出命令?
我想编写一个Python或Bash脚本,以直接将Bash命令输出到命令行(即好像我只是键入了它并且可以按Enter执行它)。
如何以这种方式输出命令?
我不认为这在bash
中是可能的。 然而,使用read
内置函数,并立即使用eval
执行输入,可以在bash
4或更高版本中模拟提示符功能的合理子集:
$ read -ei "ls -l"; eval "$REPLY"
隐式行连续不可用,例如,如果您使用|
结束该行,则需要明确提供行连续字符,并且下一行也将插入初始文本,因此您需要在继续之前清除该行。
-i
与 -e
一起使用,可以在行上放置默认值,在接受该行之前可以使用 readline
进行编辑。我曾经考虑过在这个例子中是否也包括 -r
,但最终决定不包括它,以允许显式的行继续。 - chepnercode read: usage: read [-ers] [-u fd] [-t timeout] [-p prompt] [-a array] [-n nchars] [-d delim] [name ...]
- RCColaGNU bash,版本4.2.45(2)-release(i386-apple-darwin13.0.0)
,我的Bash版本看起来还不错吧? - RCCola/usr/local/bin/bash
(或某个替代路径到 bash
4.2),并且您从使用 /bin/bash
的脚本中看到了错误?您发布的用法字符串来自 3.2 版本。 - chepnervim-slime 通过使用 screen
或者 tmux
来实现类似的功能。这是一个在 tmux
下运行的 Bash 的概念验证:
print_to_cmd_line() {
printf '%s' "$*" | tmux load-buffer -
tmux paste-buffer -d
}
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连接发送。即使您的命令包含非可打印字符或类似的奇怪字符,这也能正常工作。
使用BASH,您可以轻松地使用select内置命令来完成这项任务。这里有一个很好的例子可供参考:http://linux.die.net/Bash-Beginners-Guide/sect_09_06.html
zsh
的人,他正在寻找print -z
提供的功能。 - chepner