0

我目前正在从 GUI 按钮执行 csh shell 脚本。该脚本最初调用另一个 sql 脚本从数据库中选择信息并将其输出到 tmp 目录中的日志文件中。我现在需要 CAT 那个文件并在 xterm 窗口上显示它。我使用 javaRuntime.exec()方法来执行命令,我想我有两个可以使用的选项

  1. 重定向 std 输出以在 xterm 上显示它
  2. 使用 csh 脚本从日志文件中读取并将其输出到 xterm

所以我选择了选项 2,我什至无法让 csh 脚本输出一个简单的 hello world,这意味着当我从 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 来添加它

4

1 回答 1

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 中。

于 2012-08-06T16:38:27.727 回答