Linux cp 命令在 Java ProcessBuilder 中不起作用

Linux cp command not working from within Java ProcessBuilder

我正在尝试复制图像文件并使用 Java ProcessBuilder 将其设置为背景 运行 shell 脚本 Ubuntu。

当运行自己从终端运行脚本时,它按预期执行没有问题。

即./changeBG.sh "jpg"

然而,当 运行ning 从内部 Java 我得到输出说进程已经完成,但是在检查文件管理器时我发现 cp 从未通过,我最终得到一个运行下一个更改背景的命令时为黑色背景。

如能提供有关 cp 为何未发生的线索,我们将不胜感激。

脚本:

#!/bin/bash

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

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

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

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

您的文件“./changeBG.sh”不是操作系统意义上的可执行文件,它只是一个由bash 解释的文本文件。所以你应该使用 /bin/bash path/to/changeBG.sh args 作为你的字符串 cmd.

检查 Posix' exec(3)

您正在添加文字引号,就好像您是在 shell 中编写命令的人一样。没有人也没有 shell,所以引号不进入其中。只需使用

ProcessBuilder bd = new ProcessBuilder("./changeBG.sh", currentIMGext);