ProcessBuilder 在 java 中执行 shell 命令,但似乎没有任何效果

Execute shell commands by ProcessBuilder In java but seems nothing work

我想将选定的数据库导出到容器中。当使用 shells 命令时,我使用这个

kubectl exec -it pg-container -n data-prod -- /bin/bash -c "pg_dump -U nsc -d nsc -n public -f nsc.sql"

当 data-prod 是命名空间并且 pg-container 是具有 PostgreSQL 数据库的容器时。

此命令在 shell 中运行良好。但是我想使用 ProcessBuilder 在 Java 中执行此命令。

java中的实现是这样的:

public class ExportDBInfo {
        String dbname;
        String schemaname;
        ArrayList<String> tablesname;
        String dbuser;
        String output;
    }
for (ExportDBInfo dbinfo : Array_db_info){
            String export_database_cmd = String.format("kubectl exec -it pg-container -n data-prod -- /bin/bash -c \"pg_dump -U %s -d %s -n %s %s -f %s.sql\"",dbinfo.dbuser,dbinfo.dbname,dbinfo.schemaname,query_tables,dbinfo.output);
            ProcessBuilder pb = new ProcessBuilder(export_database_cmd);
            pb.start().waitFor();
}

但这不起作用。我想知道我的实现是否有一些错误。 非常感谢!

Java 不是 bash 或 shell。您真的不想使用 exec,它的规则有些奇怪。它非常随意地尝试按空格拆分。

而是使用 ProcessBuilder,并指定一个 列表 参数,而不是单个字符串变体。

整个 pg_dump 是一个 单个参数 并且应该 包含引号 - 这些引号是 'eaten' 通过 bash 并告诉 bash 将其全部视为一个参数; java 不是 bash,只是盲目地将它们传递给 kubectl 工具,它不知道它是什么意思。

所有其他参数(包括--)都是他们自己的东西。

所以..

List.of("/bin/kubectl", "exec", "-it", "pg-container", "-n", "data-prod", "--", "/bin/bash", "-c", String.format("pg_dump -U %s -d %s -n %s %s -f %s.sql", dbinfo.dbuser, dbinfo.dbname, dbinfo.schemaname, query_tables, dbinfo.output));

并将其传递给 ProcessBuilder 的构造函数。