Bash:从标准输入执行管道行

Bash:从标准输入执行管道行

经过一番搜索,我还没有找到解决方案。我认为搜索词太笼统了。我想知道如何执行由其他来源生成的多行代码(在 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

您正在寻找的正是参数做。

相关内容