繁体   English   中英

Java:Runtime.exec以获取Linux发行版名称

[英]Java: Runtime.exec to get Linux distro name

我想检查发行版名称,但是bash执行命令有问题。 为什么此代码可以正常工作并打印文件夹内容

String cmd[] = {"ls","-a"};
Runtime run = Runtime.getRuntime(); 
try {
    Process proc = run.exec(cmd);
    BufferedReader read=new BufferedReader(new InputStreamReader(proc.getInputStream()));
    while(read.ready()) {
        System.out.println(read.readLine());
    }
} catch (IOException e) {
    e.printStackTrace();
}   

但是cmd[] = {"cat","/etc/*-release"}; 犯规? 它根本不打印任何内容,既不出错也不发行。 OFC。 它在终端中工作。 怎么了

它在Bash中工作的原因是Bash将/etc/*-release -release识别为glob并执行必要的文件名扩展。 Process无法做到这一点; 它只是使用您指定的确切参数调用cat (换句话说,您正在运行与Bash命令cat '/etc/*-release'等效的命令。)

我想,一种选择是实际调用Bash并让它为您处理:

String cmd[] = { "bash", "-c", "cat /etc/*-release" };

但是我认为使用Java文件系统API在/etc搜索名称以-release结尾的文件更有意义,并可以正常读取该文件的内容。 (请参阅Javadoc中的java.io.FileJavadoc中的java.io.FileReader 。)

尝试这个:

    String[] cmd = {
    "/bin/sh", "-c", "cat /etc/*-release" };

    try {
        Process p = Runtime.getRuntime().exec(cmd);
        BufferedReader bri = new BufferedReader(new InputStreamReader(
                p.getInputStream()));

        String line = "";
        while ((line = bri.readLine()) != null) {
            System.out.println(line);
        }
    } catch (IOException e) {

        e.printStackTrace();
    }

Runtime.exec不会调用shell(例如bash),而是直接启动进程。 在bash中键入ls /etc/*-release -release时,bash本身负责将*扩展为与模式匹配的所有文件名。 因此,当bash调用ls命令时,ls会将实际的文件名视为参数。 另一方面,当您的Java代码调用ls命令时,ls会看到实际的字符串“ / etc / *-release”,这是一个不存在的文件。

最简单的解决方法是传递/ etc / lsb-release。 更好的解决方案是调用lsb_release -c

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM