我想查看发行版名称,但是我遇到了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。它在终端工作。这有什么问题?
答案 0 :(得分:4)
它在Bash中工作的原因是Bash将/etc/*-release
识别为glob并执行必要的文件扩展。 Process
不这样做;它只是使用您指定的确切参数调用cat
。 (换句话说,您运行的是等同于Bash命令cat '/etc/*-release'
。)
我认为,一个选项是实际调用Bash并让它为您处理:
String cmd[] = { "bash", "-c", "cat /etc/*-release" };
但我认为使用Java文件系统API搜索/etc
以查找名称以-release
结尾的文件,并正常读取该文件的内容更有意义。 (请参阅the Javadoc for java.io.File
和the Javadoc for java.io.FileReader
。)
答案 1 :(得分:0)
试试这个:
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();
}
答案 2 :(得分:0)
Runtime.exec
不会调用shell(例如bash),而是直接启动进程。当您在bash中键入ls /etc/*-release
时,bash本身负责将*扩展为与该模式匹配的所有文件名。因此,当bash调用ls命令时,ls将实际的文件名视为参数。另一方面,当你的java代码调用ls命令时,ls会看到实际的字符串" / etc / * - release",这是一个不存在的文件。
最简单的解决方法是传递/ etc / lsb-release。更好的解决方案是调用lsb_release -c
。