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

dre*_*mac 6 bash scripting interop pipe xargs

假设您有一个perl脚本"foobar.pl",它将以下内容输出到stdout

date -R
Run Code Online (Sandbox Code Playgroud)

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

你如何让bash认识到这是一个独立的命令?

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

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

$command = 'date -R'
system($command); ## in the perl script 
Run Code Online (Sandbox Code Playgroud)

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

foobar.pl | xargs bash -i {}
Run Code Online (Sandbox Code Playgroud)

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

lhu*_*ath 4

坏的:

`perl foo.pl`
$(perl foo.pl)
Run Code Online (Sandbox Code Playgroud)

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

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

很好,但不方便:

perl foo.pl > mytmpfile; bash mytmpfile
Run Code Online (Sandbox Code Playgroud)

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

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

可能是最好的解决方案:

perl foo.pl | bash
Run Code Online (Sandbox Code Playgroud)

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

具有几乎相同功能的替代方案:

bash < <(perl foo.pl)
bash <(perl foo.pl)
Run Code Online (Sandbox Code Playgroud)