Команда Linux cp не работает из Java ProcessBuilder

Я пытаюсь скопировать файл изображения и установить его в качестве фона с помощью 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

person Ivan Dankov    schedule 24.12.2018    source источник


Ответы (2)


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

ProcessBuilder bd = new ProcessBuilder("./changeBG.sh", currentIMGext);
person that other guy    schedule 24.12.2018
comment
Фантастически объяснено, не могу поверить, что я этого не заметил. Большое спасибо. - person Ivan Dankov; 24.12.2018

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

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

person Maksim    schedule 24.12.2018
comment
Пока у него есть shebang и +x, это исполняемый файл в смысле ОС. - person that other guy; 24.12.2018