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

时间:2018-12-24 02:03:28

标签: java bash sh processbuilder cp

我正在尝试使用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

2 个答案:

答案 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);