无法通过Java程序在Mac OS中运行Shell脚本

时间:2019-10-17 16:21:57

标签: java shell process processbuilder

我正在尝试在Mac OS中通过Java运行Shell脚本。 Shell脚本具有git clone命令来克隆存储库。

我尝试使用流程生成器API。 虽然它没有给出任何异常,但是当我运行代码时,存储库并未克隆。

public class Test {
public static void main(String[] args) throws IOException  {

    Process p;
    try {

        List<String> cmdList = new ArrayList<String>();

        cmdList.add("/Users/Folder/AnotherFolder/Another/Final/clone.sh");
        ProcessBuilder pb = new ProcessBuilder(cmdList);
        p = pb.start();

        p.waitFor(); 
        BufferedReader reader=new BufferedReader(new InputStreamReader(
                p.getInputStream())); 
        String line; 
        while((line = reader.readLine()) != null) { 
            System.out.println(line);
        } 
    } catch (Exception e) {

        e.printStackTrace();
        System.out.println(e.getMessage());
    } 
}

}

期望在路径中克隆git项目,但不提供任何输出或异常。

2 个答案:

答案 0 :(得分:0)

上面的JAVA代码工作正常,我怀疑脚本可能存在问题。因为当Java程序尝试执行Shell脚本时,不会知道git local repo。

在执行具有以下脚本的程序时,git clone可以正常工作。

#!/bin/bash
mkdir ~/repo
cd ~/repo
git init
#git config user.email "email"
#git config user.name "user"
/usr/local/bin/git clone https://github.com/divaibhav/helloworld

答案 1 :(得分:0)

您将忽略脚本发出的任何错误消息。

删除所有对<algorithm>的使用,并将其替换为对inheritIO()的调用:

if s and set(s) - set('\n.o'):
  return False
# s consists entirely of \n, o and .

调用s时,您仅在读取过程的标准输出。 if set(s) - set('\n.o'): 将导致子进程的标准输出和标准错误出现在Java进程自己的标准输出和标准错误中。这将允许您查看脚本打印的所有诊断消息。特别是,错误消息通常出现在标准错误上,而不是标准输出上。