经过一番搜索,我还没有找到解决方案。我认为搜索词太笼统了。我想知道如何执行由其他来源生成的多行代码(在 bash 提示符下)。例如,我有一个 Python 脚本,它动态生成许多 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
bash 中是否存在这样的命令/功能?有时其中一个命令可能以非零退出状态退出,因此附加&&
到每个命令然后运行:
$ `python example.py`
并不总是有效而且似乎是一个笨拙的解决方案。
答案1
你有没有尝试过
$ python example.py | bash
它应该可以工作,因为它是一个很常见的技巧。例如,监控工具 munin 有一个节点配置器 (munin-node-configure),它会告诉您可以运行哪些插件,然后使用一个--shell
标志,当直接传送到 bash 时,它会发出一堆ln -s
命令来链接插件。
甚至曾经有一个配置工具 - 那是 15 年前的事了,我不记得是什么了 - 你可以成为 root 用户,通过打开一个 telnet 会话到自动配置器来完成配置,然后将输出直接发送到 bash,使用
# telnet example.com 7001 | bash
我不能想象这些天来做任何类似的事情。
答案2
我会这样做:
python example.py | while read command; do $command; done
顺便说一下,非零退出状态可以通过使用;
而不是 来解决。&&
答案3
除了通过管道传输到 bash 子进程之外,您还可以使用eval
内置的 shell,适用于需要生成的 shell 代码依赖于当前 shell 环境中的某些内容,或者希望程序的输出包含诸如在当前 shell 进程中设置环境变量之类的操作的情况。
例如,假设你的输出更像这样:
$ python example.py
PATH="$PATH:/opt/wackysoft/bin"
export PATH
echo $PATH
which wackysoft-command
您可能希望PATH
在当前会话中保留更改的环境变量,因此可以使用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
ssh-agent
这与通常在 .xsession 或 .profile 配置文件中调用程序的方式类似。
答案4
您正在寻找的正是参数做。