如何使用ExpectJ工具在java代码中运行Unix shell脚本?

如何使用ExpectJ工具在java代码中运行Unix shell脚本?,java,linux,shell,expect,expectj,Java,Linux,Shell,Expect,Expectj,这是我的hello.sh shell脚本 VALID_NAME="abcd" echo "Name: " read name if [ "$name" == $VALID_NAME ]; then echo "correct" else echo "unexpected input" fi ======================================================== 这是我的Java代码 import java.io.IOException;

这是我的hello.sh shell脚本

VALID_NAME="abcd"

echo "Name: "

read name

if [ "$name" == $VALID_NAME ]; then

echo "correct"

else

echo "unexpected input"

fi
========================================================

这是我的Java代码

import java.io.IOException;

import expectj.*;

public class Trial {
public static void main(String[] args) {

    ExpectJ exp = new ExpectJ();
    String command = "sh /root/Desktop/hello.sh";
    Spawn s;
    try {
        s = exp.spawn(command);
        s.expect("Name: ");
        s.send("abcd");
        System.out.println(s.getCurrentStandardOutContents());
        s.stop();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (TimeoutException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }catch (ExpectJException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }       
}
}
======================================================================

这是我的输出

Name://这是它要的水

abcd//这就是我所给予的……什么都没有发生

============================================================


我已经更正了上面的java代码。

在您要查找的java代码中

s.expect("VALID_NAME=");
但在Bash代码中,您有:

echo "Name: "
似乎简单地将Java代码更改为以下代码就可以了:

s.expect("Name: ");

我从未使用过ExpectJ,但您的错误消息
sh:hello.sh:没有这样的文件或目录
表明它找不到您的shell脚本。您是否尝试过使用脚本的完整路径

String command = "sh /root/Desktop/hello.sh";

@达胡克:谢谢..我已经做了你们建议的更改,而且很有效..但只是在一定程度上..新的问题是接受输入..但不显示相应的输出..我遗漏了一些非常愚蠢的东西吗?\n这里和那里,也许?@Ingo:\n不是这里的问题。我想我缺少了一些语句。不确定那是什么。s.getCurrentStandardOutContents()返回standard out的内容,但您没有对它做任何处理。如果您尝试System.out.println(s.getCurrentStandardOutContents());,会发生什么@hari似乎需要使用
getCurrentStandardOutContents()
。也很可能是
expectClose()
。请参阅:。@darhuuk:我已按照您的建议进行了更改。。但输出没有更改。@hari请参阅DaveHowes在另一个答案中的评论:您向ExpectJ请求字符串,但不要对它做任何处理。如果要显示字符串,请打印它:
System.out.println(s.getCurrentStandardOutContents())
@hari如果是那样的话,请投票并接受我的答案。(我相信@DaveHowes也会很感激。)如果ExpectJ和香草Expect一样,你必须发送一份回车:
s.send(“abcd\r”)@glenn:我对expect也不太了解。这是我第一次在expectj上工作。不管怎样,我考虑了你的建议,但不幸的是,那没用。。