【问题标题】:Linux cp command not working from within Java ProcessBuilderLinux cp 命令在 Java ProcessBuilder 中不起作用
【发布时间】:2018-12-24 02:03:28
【问题描述】:

我正在尝试复制图像文件并将其设置为背景,使用 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

【问题讨论】:

    标签: java bash sh processbuilder cp


    【解决方案1】:

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

    检查 Posix' exec(3)

    【讨论】:

    • 只要有shebang和+x,它就是操作系统意义上的可执行文件
    【解决方案2】:

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

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

    【讨论】:

    • 神奇地解释了,不敢相信我没有发现这个。非常感谢。
    猜你喜欢
    • 2018-02-04
    • 1970-01-01
    • 1970-01-01
    • 2013-09-15
    • 1970-01-01
    • 2017-05-27
    • 1970-01-01
    • 2014-03-14
    • 1970-01-01
    相关资源
    最近更新 更多