将脚本的输出作为独立的bash命令运行

时间:2009-04-06 02:44:26

标签: bash interop scripting pipe xargs

假设您有一个perl脚本“foobar.pl”,它将以下内容打印到stdout

date -R

并且您希望将perl脚本输出的任何内容作为独立的bash命令运行(不要担心安全问题,因为它在受信任的环境中运行)。

如何让bash将其识别为独立命令?

我尝试过使用xargs,但似乎只想将参数传递给预先定义的命令。

我希望perl脚本能够输出任意命令。

$command = 'date -R'
system($command); ## in the perl script 

以上不起作用,因为我希望它在现有的cygwin环境中运行......

foobar.pl | xargs bash -i {}

上述方法不起作用,因为bash似乎正在运行一个新进程,因此bash_profile的初始化和设置不会被实例化。

6 个答案:

答案 0 :(得分:5)

`foobar.pl`

答案 1 :(得分:4)

给出perl文件:

print "date";

以下bash命令将执行此操作。

> $(perl qq.pl)
Mon Apr  6 11:02:07 WAST 2009

但是这是在一个单独的shell中运行的。如果您真的想在当前 shell的上下文中调用它,请执行以下操作:

$ perl qq.pl >/tmp/qq.$$ ; . /tmp/qq.$$ ; rm -f /tmp/qq.$$
Mon Apr  6 11:04:59 WAST 2009

答案 2 :(得分:4)

<强>为:

`perl foo.pl`
$(perl foo.pl)

为什么这么糟糕?由于这么多原因;最值得注意的是:

  • Wordsplitting:你在这里做的是获取perl脚本的输出,在有空格,制表符或换行符的地方将其拆分为块,并将这些块作为参数释放到第一个块,即运行命令。在像$(echo 'date +%s')这样非常简单的案例中,它可能会起作用;但这只是你真正在这里做的非常糟糕的表现。
  • 您不能引用或使用任何其他bash shell功能,如参数扩展,bash关键字等。

好,但不方便:

perl foo.pl > mytmpfile; bash mytmpfile

创建一个临时文件,将你的perl脚本的输出放入然后用bash运行,但是这很不方便,因为你需要创建(并清理!)你的临时文件,并将它放在一个可移植的可写文件中(并且安全! )位置。

另外请记住,不要使用.source来执行临时文件,除非您真的打算在活动shell中运行它。此外,当您使用.source时,您将无法在以后可靠地清理临时文件。

可能是最佳解决方案:

perl foo.pl | bash

这是非常安全的全面(在上下文中“安全”,最不容易出错),假设你的perl脚本输出正确的bash语法,当然。

做同样事情的替代方案:

bash < <(perl foo.pl)
bash <(perl foo.pl)

答案 3 :(得分:3)

尝试:

foobar.pl | bash

答案 4 :(得分:0)

我认为这不是你想要的,但它是我所拥有的: - )

perl foo.pl > /tmp/$$.script; bash /tmp/$$.script; rm /tmp/$$.script
祝你好运!

答案 5 :(得分:0)

尝试打开($ fh,“ - |”,$ arg1,$ arg2)