Bash:执行stdin的pipe道

经过一番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做的。