Команда Linux cp не работает из Java ProcessBuilder - PullRequest
0 голосов
/ 24 декабря 2018

Я пытаюсь скопировать файл изображения и установить его в качестве фона, используя Java ProcessBuilder для запуска сценария оболочки в Ubuntu.

При запуске сценария самостоятельно из терминала он выполняется без проблем, как и ожидалось.

т.е. ./changeBG.sh "jpg"

Однако при запуске изнутри Java я получаю вывод о том, что процесс завершен, но после проверки файлового менеджера я вижу, что cp никогда не запускаетсяи я получаю черный фон, когда запускаю следующую команду для изменения фона.

Подсказки о том, почему cp не происходит, будут высоко оценены.

Сценарий:

#!/bin/bash

mkdir -p /home/$USER/Pictures/Wallpapers

/bin/cp -rf ./images/newimage.$1 
/home/$USER/Pictures/Wallpapers/background.$1

gsettings set org.gnome.desktop.background picture-uri "file:///home/$USER/Pictures/Wallpapers/background.$1"

echo done 

Java-код:

try {

                String cmd= "./changeBG.sh \"" + currentIMGext + "\"" ;
                System.out.println(cmd);
                ProcessBuilder bd = new ProcessBuilder(cmd.split(" "));

                Process ps = bd.start();
                BufferedReader br = new BufferedReader(new InputStreamReader(ps.getInputStream()));
                String currentLine;

                while (true) {
                    currentLine = br.readLine();
                    if (currentLine == null) {
                        break;
                    }
                    System.out.println(currentLine);
                }

            } catch (Exception e2){
                e2.printStackTrace();
            }

Java-вывод:

./changeBG.sh "jpg"
done

Ответы [ 2 ]

0 голосов
/ 24 декабря 2018

Вы добавляете буквальные кавычки, как если бы вы были людьми, пишущими команды в оболочке.Там нет человека и нет оболочки, поэтому цитаты не входят в это.Просто используйте

ProcessBuilder bd = new ProcessBuilder("./changeBG.sh", currentIMGext);
0 голосов
/ 24 декабря 2018

Ваш файл "./changeBG.sh" не является исполняемым в смысле операционной системы, скорее это просто текстовый файл, интерпретируемый bash.Поэтому вы должны использовать /bin/bash path/to/changeBG.sh args для вашей строки cmd.

Проверьте с помощью Posix ' exec (3)

...