用Java运行Bash脚本

5

我的问题很简单,我试图从Java运行.sh脚本时,脚本没有执行。如果我将脚本更改为一个简单的Linux命令,例如ls -all,则可以完美地工作,因此我猜测在我的脚本中使用了错误的命令,导致停止执行。请帮忙。

David

Java代码:

    String cmd = "bash /home/david/burza/getter.sh";

    try {
        Process proc = Runtime.getRuntime().exec(new String[] {"/bin/sh", "-c", cmd});
        BufferedReader read = new BufferedReader(new InputStreamReader(proc.getInputStream()));
        try {
            proc.waitFor();
        } catch (InterruptedException e) {
            System.out.println(e.getMessage());
        }
        while (read.ready()) {
            System.out.println(read.readLine());
        }
    } catch (IOException e) {
        System.out.println(e.getMessage());
    }

Bash脚本:

#! /bin/bash 

wget -O data1.html http://www.rmsystem.cz/kurzy-online/akcie/easyclick;
touch ext_data.txt; 

grep 'table class="tbl1"' ./data1.html | tr '<td>' ' ' | tr '-' 'A' | grep -o -w '[0-9, ]*' | sed 's/  *//g' | sed '/^$/d' | tr ',' '.' > ext_data.txt;

lines=`wc -l ext_data.txt | grep -o '[0-9]*'`;

( echo $lines; cat ext_data.txt ) > ext_data.txt.new && mv ext_data.txt.new ext_data.txt;

你确定你的脚本已经设置为可执行吗?也许 chmod +x script.sh 可以帮助解决。 - Kiwy
你期望得到什么?你的shell脚本没有将任何内容打印到标准输出,而是将所有输出重定向到文件。那么BufferedReader有什么用呢? - zserge
这是一段愚蠢的代码,请为输入、输出和错误流编写3个线程,并进行交互式处理,这将使您免受各种麻烦。 - Space Rocker
1个回答

2

首先,将命令开头的“bash”删除。

其次,我不确定当非交互使用时,shell是否会执行#!解释。我倾向于直接在Runtime.exec()调用中跳转到/bin/bash。

最后,仅仅在stdout上存在读取器是不够的。你需要主动从stdout和stderr读取,以防止进程在写入过多输出时挂起。澄清一下,你正在等待进程完成(proc.waitFor()),然后才处理任何输出。如果进程在退出之前写入了太多输出,它将阻塞等待你清空缓冲区,而你则被阻塞等待它退出。

阅读这篇文章的全部4页:http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=1


非常感谢您的建议,我使用http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=1成功运行了它,非常感谢。 - dawe134
JavaWorld的链接失效了,有没有关键词可以在JavaWorld上搜索找到这个链接并修复它? - Akshay Hiremath

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接