如何通过Java程序运行brew命令?

3

我刚刚使用Homebrew安装了“亮度”实用程序包(它基本上是一种通过终端调整屏幕亮度的方式),但我在Java中运行此代码时遇到了困难:

    Process p = Runtime.getRuntime().exec("brightness -l");

当我通过终端运行“brightness -l”时,它会显示当前屏幕亮度级别。但是当我尝试在Java中运行该行代码时,会抛出以下错误:
“主异常线程”java.io.IOException:无法运行程序“brew”:错误=2,没有此类文件或目录"
我尝试了以下方法:
    Process p = Runtime.getRuntime().exec("/usr/local/bin/ brightness -l");

但是它给我一个权限被拒绝的错误:

Exception in thread "main" java.io.IOException: Cannot run program "/usr/local/bin/": error=13, Permission denied

所以我猜如果我授予普通用户访问bin的权限,它会起作用。但这太危险了,有没有其他方法可以做到呢?


1
嗯..."/usr/local/bin"是一个目录。这就是为什么你不能执行它的原因!普通用户应该对其具有“r_x”权限。请注意,“x”并不意味着对于一个目录来说是可执行的。 - Stephen C
2个回答

1
您的方法存在问题,就是您没有完全通过bash运行命令。 因此,我的解决方案会类似于:
Runtime.getRuntime().exec("/bin/bash -c brightness -l");

此外,建议使用ProcessBuilder而不是Runtime.exec(),因为现在已经不再推荐使用Runtime.exec()。查看文档
所以我的最终解决方案是:
String[] args = new String[] {"/bin/bash", "-c", "brightness" ,"-l"};
Process proc = new ProcessBuilder(args).start();

如果需要更多关于ProcessBuilder的示例请查看这个主题


'Runtime.getRuntime().exec("/bin/bash -c brightness -l");' 不起作用,所以我尝试创建一个bash文件来执行命令,但是当我运行bash文件时,我的读取器返回null。你认为这是我的读取器的问题还是Runtime代码本身的问题? 'while ((line = reader.readLine()) != null) { if(line.includes.........) } - Nizar G. Habib
尝试运行其他命令,比如打开一个应用程序……也许亮度本身存在问题。 - Avinash Karhana
我在bash文件中添加了一个回音行,以查看它是否正在运行bash文件,但我猜它没有在运行。Runtime.getRuntime().exec("/bin/bash <FILE_NAME>"); 由于某种原因返回null。 - Nizar G. Habib
我把<FILE_NAME>转换成了sh文件,但是出于某种原因,Java仍然没有给我任何输出。 #!/bin/sh echo "hi" brightness -l 它甚至不会返回"hi"。 - Nizar G. Habib

0

对我有效的语法是:

String command = "echo $(/usr/local/Cellar/brightness/1.2/bin/brightness -l) >    /Users/nizhabib/Desktop/FileName";
    Process po = new ProcessBuilder("/bin/sh", "-c", command).start();

'command'变量包含可执行文件'brightness'所在的目录,'-l'是函数'brightness'的标志。该命令将'brightness -l'的输出简单地导入到文本文件'FileName'中。

在'process po'中,我们在第一个参数中指定文件类型,在本例中为'sh'表示shell脚本,使用'-c'指定'/usr/local/Cellar/brightness/1.2/bin/brightness -l'需要作为字符串处理(因为路径表达式是任意的)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接