2016-08-04 15 views
1

Ich schreibe ein Java-Programm, von dem ich ein Shell-Skript ausführe. Das Shell-Skript ruft ein anderes Shell-Skript auf. Ich versuche, die vom untergeordneten Skript zurückgegebene Ausgabe in das übergeordnete Shell-Skript zu übertragen. Unten ist mein Code.Java mit Shell Skript

public class App 
{ 
    public static void main(String[] args) throws IOException, InterruptedException 
    { 
     String command = new String("/home/Test.sh"); 
     Runtime rt = Runtime.getRuntime(); 
     Process process = rt.exec(command); 
     process.waitFor(1, TimeUnit.MINUTES); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(  
       process.getInputStream()));           
     String s;                 
     while ((s = reader.readLine()) != null) {         
      System.out.println("Script output: " + s);        
     } 

Shell Script: Test.sh

#!/bin/bash 
    result=$(bash myscript.sh) 
    echo "$result" 

myscript.sh

#!/bin/bash 
    echo "50" 

ich leere Ausgabe bin immer. Ich dachte zuerst, es könnte sein, weil der Java-Prozess nicht darauf wartet, dass das Shell-Skript beendet wird. Also waitFor() hinzugefügt, aber immer noch keine Verwendung. Kann jemand freundlich helfen?

+1

Überprüfen Sie den Fehler-Stream, weil es auf meiner Seite mit Ihrem Code funktioniert –

+0

versuchen Sie dies; result = $ (bash /home/myscript.sh), vollständiger Pfad von myscript.sh –

Antwort

1

versuchen Sie dies; Das ist kein Problem.

#!/bin/bash 
    result=$(bash /home/myscript.sh) # full path of myscript 
    echo "$result" 

Behandeln Sie auch bash Fehler wie unten;

public static void main(String[] args) throws IOException { 
     String command = new String("/tmp/1/Test.sh"); 
     Runtime rt = Runtime.getRuntime(); 
     Process process = rt.exec(command); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(  
       process.getInputStream())); 

     String s;                 
     while ((s = reader.readLine()) != null) {         
      System.out.println("Script output: " + s); 
     } 

     BufferedReader stdError = new BufferedReader(new 
      InputStreamReader(process.getErrorStream())); 

     System.out.println("Here is the standard error\n"); 
     while ((s = stdError.readLine()) != null) { 
      System.out.println(s); 
     } 

    } 

adduser-Tests;

1- myscript.sh:

#!/bin/bash 
adduser test 
echo "50" 

Java-Konsole Ausgang;

Script output: 50 
Here is the standard error of the command (if any): 

adduser: Only root may add a user or group to the system. 

2- myscript.sh:

#!/bin/bash 
sudo adduser test 
echo "50" 

Java-Konsole Ausgang;

Script output: 50 
Here is the standard error of the command (if any): 

sudo: no tty present and no askpass program specified 

3-
myscript.sh:

#!/bin/bash 
echo -e "YOURPASSWORD=\n" | sudo -S adduser -shell /bin/bash --home /home/test test 
echo -e "YOURPASSWORD\n" | sudo deluser --remove-home test 
echo "OK" 

Java-Konsole Ausgang;

Script output: Adding user `test' ... 
Script output: Adding new group `test' (1002) ... 
Script output: Adding new user `test' (1001) with group `test' ... 
Script output: Creating home directory `/home/test' ... 
Script output: Copying files from `/etc/skel' ... 
Script output: Try again? [y/N] Changing the user information for test 
Script output: Enter the new value, or press ENTER for the default 
Script output: Full Name []: Room Number []:  Work Phone []: Home Phone []: Other []: Is the information correct? [Y/n] Looking for files to backup/remove ... 
Script output: Removing files ... 
Script output: Removing user `test' ... 
Script output: Warning: group `test' has no more members. 
Script output: Done. 
Script output: OK 
Here is the standard error of the command (if any): 

[sudo] password for ..: Enter new UNIX password: Retype new UNIX password: passwd: Authentication token manipulation error 
passwd: password unchanged 
Use of uninitialized value $answer in chop at /usr/sbin/adduser line 563. 
Use of uninitialized value $answer in pattern match (m//) at /usr/sbin/adduser line 564. 
Use of uninitialized value $answer in chop at /usr/sbin/adduser line 589. 
Use of uninitialized value $answer in pattern match (m//) at /usr/sbin/adduser line 590. 
+0

Danke. Das Hinzufügen des vollständigen Pfads hat geholfen. Ich verstehe die bash Fehlerbehandlung gerne. Welche Art von Fehlern werden erfasst? Angenommen, ich benutze ** "adduser" ** Befehl im Skript, ** "Nur root Benutzer können neue Benutzer hinzufügen" ** Fehler wird ausgelöst, wenn nicht ein Root-Benutzer. Wird das hier festgehalten? – Learner

+1

Ja, das wird erfasst. Auch versuche ich wie oben beschrieben zu testen; Vielleicht kann das helfen –