我目前正在从GUI按钮执行csh shell脚本。该脚本最初调用另一个sql脚本来从数据库中选择信息并将其输出到tmp目录中的日志文件。我现在需要CAT该文件并在xterm窗口中显示它。我使用java Runtime.exec()
方法执行命令,我想我有两个选项可以使用
所以我选择了选项2,我甚至无法获得csh脚本来输出一个简单的hello世界,这意味着当我从netbeans运行它时,我无法将任何内容放到屏幕上。当我尝试直接从xterm运行脚本时,它可以工作。这是脚本代码
#!/bin/csh -f
#set MYSQL=${MYSQL_HOME}/mysql
#set PSQL=${PSQL_HOME}/psql
echo "Hello World"
#set REPORT=${CLEADM_HOME}/Scripts/DataValidation/CLEADM_EarthOrientationParametersDataReport.sql
#${REPORT}
#${PSQL} ${CLEDBUSER}<${REPORT}
#Get the number of lines in the report file for scrollbar control
#set lc='wc -l /tmp/results.log'
#echo $lc
我评论了所有内容,只是为了看看我是否可以将结果打印(回显)到屏幕上,但这不起作用。当我直接从xterm运行它(~/.mysqlconnection.csh
)时,它似乎工作并打印出“Hello World”。我不知道出了什么问题。所以我试图通过在我的脚本顶部添加此代码来强制终端出现
/usr/openwin/bin/XTERM \ this opens up the xterm but leaves it frozen for some reason? now i cant access anything on my computer
下面是我用来从java按钮执行csh脚本的代码。我把这个方法称为按钮
public class RunShellScript {
public static void runShellScript (String unixCommand)
{
try {
Runtime runtime=Runtime.getRuntime();
Process process=runtime.exec(new String [] { "/bin/csh", "-c", unixCommand});
InputStream stderr=process.getErrorStream();
InputStreamReader isr=new InputStreamReader (stderr);
BufferedReader br=new BufferedReader (isr);
String line=null;
System.out.println("<ERROR>");
while((line=br.readLine())!=null)
System.out.println(line);
System.out.println(line);
int exitVal=process.waitFor();
System.out.println("Process exitValue:" + exitVal);
}
catch (Throwable t)
{
t.printStackTrace();
}
在某个地方我需要将输出重定向到一个exterm,我很困惑如何使用streamreader进行掺杂
答案 0 :(得分:1)
编辑 - 我完全重复了我的回答,因为我严重误解了这些要求。
如果每次用户按下按钮都需要一个新窗口,那么从csh脚本中打开xterm应该可以正常工作;试试这个:
/usr/openwin/bin/xterm -e "bash -c 'cat /tmp/results.log; echo press a key to continue; read'" &
如果您希望一个窗口永远保持打开状态,但每次用户按下按钮时都会不断更新新结果,那就有点不同了。我会尝试从Java生成另一个窗口。您可以拥有单独的Java窗口/框架,也可以使用其他xterm。要使用另一个xterm,请尝试以某种方式运行Process
,如下所示:
new ProcessBuilder("/usr/openwin/bin/xterm","-e","tail -f /tmp/results.log").start();
这将在tail -f
文件上打开results.log
命令,您添加到日志文件的所有内容都将显示在xterm中。