【问题标题】:Running shell script from java code and pass arguments从 java 代码运行 shell 脚本并传递参数
【发布时间】:2023-03-06 14:53:01
【问题描述】:

我正在从 Java 程序执行一个 shell 脚本。我已经使用 Runtime 类实现了它。下面是我实现的代码

final StringBuilder sb = new StringBuilder("test.sh");
sb.append("/path to/my/text file");

final Process p = Runtime.getRuntime().exec(sb.toString());

这里 sb 是字符串缓冲区对象,我在其中附加参数并在 exec 方法中使用它。但问题是我传递的参数“/path to/my/text file”被认为是4个参数

/path
 to
/my/text
 file

但如果在 shell 中作为 test.sh "/path to/my/text file" 运行,它被视为单个参数。如何使用 Java 代码实现相同的目标,我需要将带有空格的路径视为单个参数。任何请都将是非常可观的。

【问题讨论】:

    标签: java shell runtime.exec shell-exec


    【解决方案1】:

    使用 ProcessBuilder ,这是它的设计目的,让您的生活更轻松

    ProcessBuilder pb = new ProcessBuilder("test.sh", "/path", "/my/text file");
    Process p = pb.start();
    

    【讨论】:

    • 为什么有 2 个参数 "/path" 和 "/my/text file" ?不应该是 new ProcessBuilder("test.sh", "/path to/my/text file")
    • 不,每个参数必须分开,否则它们将作为单个参数发送到进程,这就是为什么最后一个参数不需要在引号中转义
    【解决方案2】:

    使用这个:

    final StringBuilder sb = new StringBuilder("test.sh");
    sb.append(" \"/path to/my/text file\"");
    

    【讨论】:

      【解决方案3】:

      要重新创建您在 shell 中手动运行的命令 test.sh "/path to/my/text file",您需要包含引号。

      final StringBuilder sb = new StringBuilder("test.sh");
      sb.append(" \"/path to/my/text file\""); //notice escaped quotes
      final Process p = Runtime.getRuntime().exec(sb.toString());
      

      【讨论】:

        【解决方案4】:

        您的方法是正确的,您只需要在参数前添加space (" ") 并转义参数中的"/" and " " 字符

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-11-27
          • 2018-09-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-06
          相关资源
          最近更新 更多