【问题标题】:Execute apache-commons-exec multiple commands with semicolon用分号执行 apache-commons-exec 多个命令
【发布时间】:2015-12-14 13:13:08
【问题描述】:

我正在使用 apache-commons-exec 在 Java 应用程序中执行一些命令。

当我执行 'ls -la /home/user' 时效果很好。

但我需要执行类似的操作

./setEnvsOfTypeXXX.sh; ./setEnvsOfTypeYYY.sh; ls -la /home/user

我将命令输入到 CommandLine 对象中,但它不起作用。

它返回一个空字符串和 -559038737 退出代码。

因为环境和脚本的性质(第一个设置了一些需要的环境变量);我不能把所有的调用都放到一个脚本中 我尝试了很多解决方案(比如用引号将所有命令括起来,如“'”或使用 PumStreamHandlet 输入流),但到目前为止没有任何效果......

有人有想法吗?

【问题讨论】:

    标签: java apache-commons-exec


    【解决方案1】:

    试试

    sh -c '. ./setEnvsOfTypeXXX.sh; . ./setEnvsOfTypeYYY.sh; ls -la /home/user'
    

    听从你的命令

    我猜你需要两件事。

    首先,如果您要设置环境变量,您可能需要使用 . 其次,你想运行一个 shell 并让 shell 执行 shell 脚本,然后运行以下命令,所有这些都在同一个上下文中

    【讨论】:

    • 它对你有用吗?如果是这样,你能更新答案吗?您也可以尝试使用 && 连接命令
    【解决方案2】:

    我试过这段代码

    cmdLine = new CommandLine("/bin/bash");
    cmdLine.addArgument("-c");
    cmdLine.addArgument(new StringBuilder().append("'").append(command).append("'").toString());
    

    即使是command = "ls";

    有一个错误

    bash: ls: No such file or directory
    

    有趣的事实:在 Windows 中这可以正常工作!

            cmdLine = new CommandLine("cmd.exe");
            cmdLine.addArgument("/c");
            cmdLine.addArgument(new StringBuilder().append("\"").append(command).append("\"").toString());
            logger.info("Command win line: cmd.exe /c \""+command + "\"");
    

    我现在完全没有选择了!!!

    【讨论】:

    【解决方案3】:

    我有一个解决方法:使用命令创建一个临时 sh 文件,将 shebang 放在第一行并授予权限,在一个命令行中执行此文件,获取结果和输出,最后删除临时文件...

    它有效!

    【讨论】:

      猜你喜欢
      • 2017-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-01
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多