以下命令在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
有人能在这里指出这个问题吗?
1条答案
按热度按时间ugmeyewa1#
在bash中,命令替换结果不会经过所有解析步骤。这意味着复合命令
if
不值得尊敬,命令分隔符如;
没有句法意义等。如果您想覆盖它并强制执行额外的解析过程,则需要使用
eval
. 因此:为什么在shell中运行它而不是从processbuilder中运行它时,它会起作用?因为运行它的shell将在中执行命令替换
"$(...)"
,并将替换结果放入传递给子shell的文本中;因此,在解析时已经完成了替换。