java - 从 Java 执行未标记化的命令行

标签 java command-line

我目前正在使用 ProcessBuilder 从 Java 服务器运行命令。该服务器将取代旧的 Perl 服务器,我们的许多遗留代码都指定了特定于平台的命令行。

例如,在 Windows 上它可能会这样做:

command -option "hello world"

在 unix 上它可能会这样做:

command -option 'hello world'

问题是 ProcessBuilder 和 Runtime.exec 都采用标记化的命令行(例如,{"command", "-option", "hello world"} 用于 unix 和 windows)。

虽然我更喜欢独立于平台的方式,但我们的代码库中有大约 3000 万行 perl 代码。如果我不为不同的平台编写分词器(真的没什么大不了的,我只是不想做 WTF),有没有办法让操作系统上的 shell 对命令行进行分词?

最佳答案

你能使用重载的Runtime.exec(String)吗?接受单个字符串并将其作为整个命令运行?


以下适用于 Windows:

Process p = Runtime.getRuntime().exec("perl -e \"print 5\"");
System.out.println(IOUtils.toString(p.getInputStream()));
p.destroy();

这或多或少就是 Runtime.exec(String) 正在做的事情:

public static void main(String [] args) throws Exception {
    Process p = new ProcessBuilder(getCommand("perl -e \"print 5\"")).start();
    System.out.println(IOUtils.toString(p.getInputStream()));
    p.destroy();

}

private static String[] getCommand(String input) {
    StringTokenizer tokenizer = new StringTokenizer(input);
    String[] result = new String[tokenizer.countTokens()];
    for (int i = 0; tokenizer.hasMoreTokens(); i++) {
        result[i] = tokenizer.nextToken();
    }
    return result;
}

关于java - 从 Java 执行未标记化的命令行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1980671/

相关文章:

java - Android MapView 类未找到

java - Web 服务中关于身份验证失败的用户通知方式哪种更好?

java - 无法找到类 Spring Enum Mybatis 异常的可用构造函数

linux - 从 Linux 中的多个文件中删除文本行

python - 当类没有继承任何内容时,从命令行调用 python 脚本会出现语法错误,这是为什么?

客户端的 Java RMI ClassNotFoundException

java - Actor 远离摄像机而不是在 LibGdx 中沿 X 轴移动

command-line - Firebird 定制安装

bash - 转义参数中的冒号、等于、& 符号

java - 如何在命令行中将文件作为参数传递给 .jar 文件?