【问题标题】:Multiple shell commands executed in one process in groovy scriptgroovy脚本在一个进程中执行多个shell命令
【发布时间】:2018-05-11 08:54:33
【问题描述】:

我想获取一个 npm 包并将其解压到一个 groovy 脚本中,如下所示:

def cmd = "cd .composerpages/umanagement && npm pack @mag-umanagement/umanagement-pages-v2810@^28.10.4-SNAPSHOT && tar xvzf *.tgz"
cmd.execute()

不幸的是,它只执行第一个术语(cd .composerpages/umanagement)。

有没有办法在一个 shell 进程中执行多个命令?

【问题讨论】:

    标签: shell groovy npm process


    【解决方案1】:

    如果您需要那里的所有“shell-isms”,那么只需让 shell 处理它(使用-c)。例如:

    def cmd = "cd .composerpages/umanagement && npm pack @mag-umanagement/umanagement-pages-v2810@^28.10.4-SNAPSHOT && tar xvzf *.tgz"
    ["/bin/sh", "-c", cmd].execute()
    

    【讨论】:

      【解决方案2】:

      我认为您需要执行所有选项,而不是 && 它们。

      你应该这样处理它:

      def cmd = 'cd .composerpages/umanagement'.execute() | 'npm pack @mag-umanagement/umanagement-pages-v2810@^28.10.4-SNAPSHOT'.execute() | 'tar xvzf *.tgz'.execute()
      cmd.waitFor()
      println cmd.text
      

      【讨论】:

        【解决方案3】:

        在这种情况下,您可以尝试将命令管道标记为命令列表并按顺序执行它们,只要它们返回退出代码0(当命令返回非零退出代码时&& 停止命令管道)。考虑以下示例:

        def cmd = 'echo test && echo foo && exit 1 && echo 123'
        
        cmd.tokenize('&&').every {
          try {
            def p = it.execute()
            def output = p.text.trim()
        
            p.waitFor()
        
            println output
        
            return p.exitValue() == 0
          } catch (e) {
            return false
          }
        }
        

        这里我们有 4 个命令的管道:

        • echo test
        • echo foo
        • exit 1
        • echo 123

        使用 AND 运算符 (&&) 链接这些命令预计会在 exit 1 之后停止管道。

        只要返回的谓词是true,Groovy 的Iterable.every(Closure closure) 方法就会执行。在我们的例子中,只要退出代码是0,我们就会继续迭代命令列表。

        运行上面的例子会产生以下输出到控制台:

        test
        foo
        

        【讨论】:

        • 我认为,这将在不同的子进程中运行。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-19
        • 1970-01-01
        • 2017-09-15
        • 2010-09-14
        • 2011-04-26
        相关资源
        最近更新 更多