【问题标题】:run the output of a script as a standalone bash command将脚本的输出作为独立的 bash 命令运行
【发布时间】:2010-10-17 17:37:10
【问题描述】:

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

【问题讨论】:

    标签: bash interop scripting pipe xargs


    【解决方案1】:
    `foobar.pl`
    

    【讨论】:

      【解决方案2】:

      不好:

      `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)
      

      【讨论】:

      • bash
      【解决方案3】:

      给定 perl 文件:

      print "date";
      

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

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

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

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

      【讨论】:

      • 在 $() 的情况下,命令“perl qq.pl”在单独的 shell 中运行,但它返回的命令“date”在当前 shell 中运行,即,我想,他想要什么。
      • 您不应该使用.source 来运行这些命令。你永远不知道脚本会对你运行的 shell 做什么;这意味着您不能依赖这样一个事实,即您甚至有机会正确地进行临时文件清理。将清理工作置于 EXIT 的陷阱中可能会有所帮助。
      • @lhunath,您没有阅读问题吗? Quoth the raven “不要担心安全问题,因为它是在受信任的环境中运行的”。我认为这意味着 Perl 脚本的输出受到控制。以及“。”的使用。是专门为了满足它不启动新流程的要求。
      【解决方案4】:

      试试:

      foobar.pl | bash
      

      【讨论】:

        【解决方案5】:

        我不认为这正是您正在寻找的东西,但这是我所拥有的 :-)

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

        祝你好运!

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 2021-09-08
            • 2022-12-08
            • 1970-01-01
            • 2021-05-02
            • 2011-01-22
            • 2018-08-19
            • 2013-09-19
            • 1970-01-01
            • 2020-04-30
            相关资源
            最近更新 更多