6

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

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 的初始化和设置没有被实例化。

4

6 回答 6

5
`foobar.pl`
于 2009-04-06T03:04:31.263 回答
4

给定 perl 文件:

print "date";

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

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

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

$ perl qq.pl >/tmp/qq.$$ ; . /tmp/qq.$$ ; rm -f /tmp/qq.$$
Mon Apr  6 11:04:59 WAST 2009
于 2009-04-06T03:05:47.827 回答
4

坏的:

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

为什么这很糟糕?因为很多原因;最为显着地:

  • 分词:您在这里所做的是获取 perl 脚本的输出,将其拆分为任何有空格、制表符或换行符的块,并将这些块作为要运行的命令的第一个块的参数。在非常简单的情况下,$(echo 'date +%s')它可能会起作用;但这只是你在这里真正做的事情的一个非常糟糕的代表。
  • 您不能引用或使用任何其他bashshell 功能,如参数扩展、bash 关键字等。

好,但不方便:

perl foo.pl > mytmpfile; bash mytmpfile

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

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

可能是最好的解决方案:

perl foo.pl | bash

当然,假设您的 perl 脚本输出正确的 bash 语法,这在所有方面都是非常安全的(“安全”在最不容易出错的情况下)。

做几乎相同的事情的替代品:

bash < <(perl foo.pl)
bash <(perl foo.pl)
于 2009-04-06T07:11:10.297 回答
3

尝试:

foobar.pl | bash
于 2009-04-06T02:53:43.317 回答
0

我不认为这正是你要找的东西,但它就是我所拥有的:-)

perl foo.pl > /tmp/$$.script; bash /tmp/$$.script; rm /tmp/$$.script

祝你好运!

于 2009-04-06T03:00:01.803 回答
0

尝试使用 open($fh,"-|",$arg1,$arg2)

于 2009-05-05T15:05:14.317 回答