java - 来自 csh 脚本的 echo 未显示在终端上

标签 java process csh

我当前正在通过 GUI 按钮执行 csh shell 脚本。该脚本最初调用另一个sql脚本从数据库中选择信息并将其输出到tmp目录中的日志文件中。我现在需要 CAT 该文件并将其显示在 xterm 窗口上。我使用 java Runtime.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,但我对如何使用流读取器进行操作感到困惑

最佳答案

编辑 - 我完全重新开始我的回答,因为我严重误解了要求。

如果您希望在用户每次按下按钮时打开一个新窗口,那么从 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();

这将在 results.log 文件上打开 tail -f 命令,并且您添加到日志文件中的所有内容都将显示在 xterm 中。

关于java - 来自 csh 脚本的 echo 未显示在终端上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11831921/

相关文章:

java - 这个 Runnable 不会发生内存泄漏吗?

java - 不创建表的Spring Hibernate

Python 退出处理程序

如果我去 bash 然后 tcsh (anaconda),则 Python3 只在 tcsh 中打开

list - 如何将项目附加到 csh 列表?

escaping - 如何在别名中转义 awk 命令中的字段变量?

java - 设置 Android 开发环境需要在 Mac 上重新安装 Java,为什么?

java - 如何从文件读入并使用读取文件的输入创建新对象

android - 如何杀死Android应用程序启动的logcat进程?

process - 贵公司收集哪些统计数据来定义代码/软件产品质量