假设您有一个 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 中的初始化和设置不会被实例化。

有帮助吗?

解决方案

坏的:

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

为什么这样不好?因为很多原因;最为显着地:

  • 分词:您在这里所做的就是获取 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)

其他提示

`foobar.pl`

鉴于perl的文件:

print "date";

下面bash命令将做到这一点。

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

但是,在一个单独的外壳中运行。如果你真的想调用它的上下文中的电流的外壳,这样做:

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

尝试:

foobar.pl | bash

我不认为这是你在寻找什么,但我已经有了: - )

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

祝你好运!

开放的尝试($跳频, “ - |”,$ ARG1,ARG2 $)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top