经过一番search,我还没find解决办法。 我认为search条件太笼统了。 我想知道如何执行一些行(在bash提示符),这是由其他来源生成的。 例如,我有一个Python脚本,它dynamic生成一些bash命令并将它们print
到stdout。 我想这些行作为bash脚本执行,而不必将其保存到磁盘。 例如:
$ python example.py touch 1 2 3 4 5 rm 1 2 3 4 5 echo "Done"
我想要做一些事情:
$ python example.py | executeLines
这样的命令/function是否存在于bash中? 有时候,其中一个命令可能会以非零退出状态退出,因此在每个命令后附加&&
,然后运行:
$ `python example.py`
将不会总是工作,似乎是一个笨拙的解决scheme。
你有没有尝试过
$ python example.py | bash
它应该工作,因为这是一个普遍的技巧。 例如,监控工具munin有一个节点configuration器(munin-node-configure),告诉你可以运行什么插件,然后带一个--shell
标志,使得它吐出一串ln -s
命令来链接插件,当直接传送到bash。
甚至有一种工具可以configuration一些东西 – 15年前,我记不得什么 – 你将成为root用户,并通过打开telnet会话到自动configuration器来完成configuration,并将输出直接发送到bash ,与
# telnet example.com 7001 | bash
我无法想象现在有这样的事情。
我会这样做:
python example.py | while read command; do $command; done
非零退出状态可以使用;
顺便说一下,而不是&&
。
您可以使用另一种技术来代替pipe道到bashsubprocess,这是eval
shell内置的,用于需要生成的shell代码依赖当前shell环境中的某些内容的情况,或者您希望程序的输出包含像在当前shell进程中设置环境variables。
例如,说你的输出更像这样:
$ python example.py PATH="$PATH:/opt/wackysoft/bin" export PATH echo $PATH which wackysoft-command
您可能希望将更改后的PATH
环境variables保留在当前会话中,因此您可以使用eval
。 例如:
$ eval "`python example.py`" /bin:/sbin:/usr/bin:/usr/sbin:/opt/wackysoft/bin /opt/wackysoft/bin/wackysoft-command $ echo $PATH /bin:/sbin:/usr/bin:/usr/sbin:/opt/wackysoft/bin $ which wackysoft-command /opt/wackysoft/bin/wackysoft-command
这与通常在.xsession或.profileconfiguration文件中调用ssh-agent
等程序类似。
难道你不能在os.system
调用的帮助下将它们作为你的Python脚本中的subprocess来执行吗?
你正在寻找的是什么xargs做的。