来自csh脚本的回显未显示在终端上

时间:2012-08-06 16:06:06

标签: java process csh

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

  1. 重定向std输出以在xterm上显示它
  2. 使用csh脚本从日志文件中读取,然后输出到xterm
  3. 所以我选择了选项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进行掺杂

1 个答案:

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