bash命令不适用于processbuilder

xe55xuns  于 2021-09-13  发布在  Java
关注(0)|答案(1)|浏览(439)

以下命令在bash中执行良好:
命令:

bash -c "$(echo 'H4sIAArQ/mAAA1WMuw7CIBRAd77ihLJqtKuTg19hHIjetiQU0svl/1sn43weaeKJD4PnlI2R1w1bpOBA3kvF340ssX1Z1LmvUqyhsvWk8jl7nOQmP/2x9ZixSlXWqnLcYvlrw4VwJYxHOiW3AwCHgS2AAAAA' | base64 --decode | zcat)" - -a -b

输出:

Equal to or more than 2 arguments - -a -b

想知道-如何使用java的processbuilder实现这一点?
我尝试了以下方法:

ProcessBuilder processBuilder = new ProcessBuilder(args);

其中arg是:

bash
-c
"$(echo 'H4sIAArQ/mAAA1WMuw7CIBRAd77ihLJqtKuTg19hHIjetiQU0svl/1sn43weaeKJD4PnlI2R1w1bpOBA3kvF340ssX1Z1LmvUqyhsvWk8jl7nOQmP/2x9ZixSlXWqnLcYvlrw4VwJYxHOiW3AwCHgS2AAAAA' | base64 --decode | zcat)"
-
-a
-b

但我不断发现以下错误:

-: if: command not found

Process finished with exit code 127

有人能在这里指出这个问题吗?

ugmeyewa

ugmeyewa1#

在bash中,命令替换结果不会经过所有解析步骤。这意味着复合命令 if 不值得尊敬,命令分隔符如 ; 没有句法意义等。
如果您想覆盖它并强制执行额外的解析过程,则需要使用 eval . 因此:

args = String[]{
  "bash",
  "-c",
  "eval \"$(echo 'H4sIAArQ/mAAA1WMuw7CIBRAd77ihLJqtKuTg19hHIjetiQU0svl/1sn43weaeKJD4PnlI2R1w1bpOBA3kvF340ssX1Z1LmvUqyhsvWk8jl7nOQmP/2x9ZixSlXWqnLcYvlrw4VwJYxHOiW3AwCHgS2AAAAA' | base64 --decode | zcat)\"",
  "-",
  "-a",
  "-b",
}

为什么在shell中运行它而不是从processbuilder中运行它时,它会起作用?因为运行它的shell将在中执行命令替换 "$(...)" ,并将替换结果放入传递给子shell的文本中;因此,在解析时已经完成了替换。

相关问题