我正在尝试使用Java ProcessBuilder复制图像文件并将其设置为背景,以便在Ubuntu上运行Shell脚本。
当我自己从终端运行脚本时,它会按预期执行,没有问题。
即./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
答案 0 :(得分:1)
就操作系统而言,文件“ ./changeBG.sh”不是可执行文件,而是仅由bash
解释的文本文件。因此,您应该将/bin/bash path/to/changeBG.sh args
用作字符串cmd
。
使用Posix的exec(3)
答案 1 :(得分:0)
您正在添加文字引号,就像您是在shell中编写命令的人一样。没有人,也没有外壳,因此引号不会输入其中。只需使用
ProcessBuilder bd = new ProcessBuilder("./changeBG.sh", currentIMGext);