假设您有一个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的初始化和设置不会被实例化。
答案 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)
为什么这么糟糕?由于这么多原因;最值得注意的是:
$(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)