эхо от скрипта csh не отображается на терминале

В настоящее время я выполняю сценарий оболочки csh с помощью кнопки графического интерфейса. Первоначально сценарий вызывает другой сценарий sql для выбора информации из базы данных и вывода ее в файл журнала в каталоге tmp. Теперь мне нужно преобразовать этот файл в CAT и отобразить его в окне xterm. Я использую метод java Runtime.exec() для выполнения команды, и я решил, что у меня есть два варианта, которые я могу использовать.

  1. Перенаправьте стандартный вывод, чтобы показать его на xterm
  2. Чтение из файла журнала с помощью сценария csh и вывод в xterm

Поэтому я выбрал вариант 2, и я даже не могу заставить скрипт csh выводить простой привет, мир, что означает, что я не могу ничего вывести на экран, когда запускаю его из 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

ниже приведен код, который я использую для выполнения сценария csh с помощью кнопки java. я вызываю этот метод за кнопкой

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


person rambokayambo    schedule 06.08.2012    source источник


Ответы (1)


РЕДАКТИРОВАТЬ. Я полностью начинаю свой ответ, так как плохо понял требования.

Если вы хотите открывать новое окно каждый раз, когда пользователь нажимает кнопку, тогда открытие xterm из сценария csh должно работать; попробуй это:

/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.

person Rob I    schedule 06.08.2012
comment
извините, я новичок в java, и я не понимаю, как ваш пример подойдет для моей ситуации. Вы хотите, чтобы я опубликовал код класса и метода, который я использую для вызова скрипта sing java runtime.exec? - person rambokayambo; 06.08.2012
comment
ваш пример хорош, но, похоже, он заботится только о выводе ошибок. Я также хочу, чтобы фактический вывод был напечатан в xterm, и я не вижу его нигде в вашем коде? - person rambokayambo; 06.08.2012
comment
Вызов pb.redirectErrorStream() должен привести к отправке вывода ошибки в тот же поток, что и стандартный вывод, чтобы оба были доступны с getInputStream(). - person Rob I; 06.08.2012
comment
где вы указываете стандартный вывод для перехода на экран xterm? - person rambokayambo; 06.08.2012
comment
Ой. Кажется, я наконец понял (извините!). Подойдет ли вам такое простое решение, как запуск tail -f /tmp/results.log из xterm? Поскольку ваш скрипт, кажется, уже обновляет этот файл, он кажется достаточно чистым. Все эти вещи Java, которые я добавил, не понадобятся. - person Rob I; 06.08.2012
comment
извините, может быть, я не объяснил это хорошо. Мой сценарий выводит данные в файл журнала, и теперь я хочу, чтобы этот файл журнала отображался на xterm. Должен ли я вставить этот синтаксис в файл csh? - person rambokayambo; 06.08.2012
comment
Нет, файл csh должен быть в порядке. Просто запустите эту команду из подсказки в файле xterm. Xterm работает на том же узле, что и ваш инструмент java/csh, верно? - person Rob I; 06.08.2012
comment
да.. но я думаю, что вы все еще неправильно понимаете. Вывод должен вызываться в xterm, когда пользователь нажимает кнопку или событие в графическом интерфейсе java, а НЕ путем запуска команды из приглашения. - person rambokayambo; 06.08.2012
comment
К сожалению, если вы хотите что-то вывести в xterm, вам нужно запустить команду в xterm. Команду tail -f можно запустить один раз, когда вы впервые открываете xterm (или открываете xterm как xterm -e "tail -f /tmp/results.log" &), и продолжаете видеть изменения в файле журнала каждый раз, когда он обновляется нажатием кнопки. Другим решением было бы не использовать xterm, а открыть другое окно Java. - person Rob I; 06.08.2012
comment
хорошо, мои требования указывают, что это должно быть так, как мой вывод просматривается, и поэтому я должен использовать это. Я думаю, что это можно сделать, потому что, когда я помещаю следующее в свой скрипт оболочки csh /usr/openwin/bin/xterm \, он фактически открывает другой xterm, но затем он оставляет мои экраны замороженными. - person rambokayambo; 06.08.2012
comment
я разместил его в своем первоначальном вопросе, чтобы вы могли увидеть мое редактирование сценария - person rambokayambo; 06.08.2012