将脚本的输出作为独立的 bash 命令运行
题
假设您有一个 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 $)
不隶属于 StackOverflow