Как запустить команду пива через java-программу?

88
8

Поэтому я только что установил пакет "яркости" с помощью homebrew (в основном это способ настройки яркости экрана через терминал), но мне сложно работать с этим кодом в java:

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

Когда я запускаю "яркость -l" через терминал, он дает текущий уровень яркости экрана. Но когда я пробую строку через java, она выдает эту ошибку:

Исключение в потоке "main" java.io.IOException: не удается запустить программу "brew": ошибка = 2, нет такого файла или каталога

Я пробовал следующее:

    Process p = Runtime.getRuntime().exec("/usr/local/bin/ brightness -l");

но это дает мне разрешение отклонить ошибку:

Исключение в потоке "main" java.io.IOException: не удается запустить программу "/usr/local/bin/": error = 13, Permission denied

Поэтому я предполагаю, что это сработает, если я разрешу постоянным пользователям обращаться к bin. Но это слишком рискованно, есть ли другой способ сделать это?

спросил(а) 2021-01-28T01:42:43+03:00 4 месяца, 3 недели назад
1
Решение
63

Проблема в вашем методе заключается в том, что вы не выполняете команду только через bash. Поэтому мое решение будет чем-то вроде

Runtime.getRuntime().exec("/bin/bash -c brightness -l");

Кроме того, рекомендуется использовать ProcessBuilder, потому что использование Runtime.exec() теперь обескуражено, посмотрите документацию

Поэтому моим окончательным решением было бы:

String[] args = new String[] {"/bin/bash", "-c", "brightness" ,"-l"};
Process proc = new ProcessBuilder(args).start();

Дополнительные примеры ProcessBuilder см. в этом разделе

ответил(а) 2021-01-28T01:42:43+03:00 4 месяца, 3 недели назад
45

Синтаксис, который работал для меня, был:

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" содержит каталог, который включает в себя исполняемую "яркость", а "-l" - это флаг для функции "яркость". Команда просто заливает вывод "яркости -l" в текстовый файл "FileName".

в "процессе po" мы указываем тип файла в первом аргументе, который в этом случае является "sh" для сценария оболочки и -c, чтобы указать, что "/usr/local/Cellar/brightness/1.2/bin/brightness [ CN00] 'должен обрабатываться как строка (поскольку выражение пути произвольно)

ответил(а) 2021-01-28T01:42:43+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема