Frage Wie kann ich einen Wert von einem Java-Programm an die Shell zurückgeben?


Ich möchte ein Java-Programm von einem Shell-Skript ausführen. So habe ich etwas wie unten getan

Meine Test-Java-Datei ist wie folgt

public class EchoTest {
    public static void main (String args[]) {
    System.out.println ("scuccess ..!!");
}

Meine Test-Shell-Skriptdatei ist wie folgt

out=$(java EchoTest)    
echo $out

Ich habe das Java-Programm zusammengestellt, und dann habe ich den Shell-Skript (wie $ sh Myscript.sh) lief. Jetzt druckte es die Ausgabe auf die Konsole. Bis jetzt funktioniert es gut.

Wenn ich ein Programm wie unten schreibe (was eine Ausnahme auslöst)

  public class EchoTest {
        public static void main (String args[]) {
        System.out.println ("Value is "+(2/0));
    }

Es wird nur die Java-Ausnahme auf die Konsole gedruckt. Aber meine Forderung ist, dass ich es 0 oder 1 auf Konsole ausdrucken mag, das heißt I 0 (null) erhalten will, wenn mein Java-Programm fehlschlägt und wollen 1 erhalten (eins), wenn Java-Programm erfolgreich ausgeführt wird.


7
2017-07-28 15:17


Ursprung


Antworten:


Die Dokumentation aus dem Java-Programm sagt:

EXIT STATUS

Die folgenden Exit-Werte werden in der Regel durch den Launcher zurückgegeben, in der Regel, wenn der Werfer mit den falschen Argumenten, schwerwiegenden Fehlern genannt wird, oder von der Java Virtual Machine geworfen Ausnahmen. Eine Java-Anwendung kann jedoch einen beliebigen Wert mithilfe des API-Aufrufs System.exit (exitValue) zurückgeben.

  • 0: Erfolgreicher Abschluss.
  • > 0: Ein Fehler ist aufgetreten.

Also, wenn Sie tun nichts, folgt die JVM die gemeinsame Konvention einen Wert 0 für den Anrufer auf erfolgreichen Abschluss und einen nicht Nullwert im Fehlerfall zurückzugeben.

Ihr Shell-Skript sollte dann sein:

java EchoTest
if [ $? -eq 0]
then echo 1
else echo 0
fi

Das bedeutet, dass Sie die Standardausgabe und Standardfehler ignorieren und verlassen nur auf dem Exit-Status von der JVM.

Wie von @alk vorgeschlagen, können Sie sogar die erste Zeile mit ersetzen out = $( java EchoTest ) und benutzen $out in dem Erfolg Zweig (wenn $? ist 0)


5
2017-07-28 15:42



Sie müssen verwenden System.exit(code) mit dem Code, den Sie möchten, wenn Sie einen Fehler / eine Ausnahme feststellen oder nicht

du wirst haben

System.exit(0) // if you detect error, you need to handle exception
System.exit(1) // when no error

4
2017-07-28 15:24



Ein vollständigeres Beispiel für die Behandlung eines Programms aus der Shell könnte sein

#!/bin/bash
#
# run.sh command
#
# Runs command and logs the outcome to log.<pid> and err.<pid>.
#

cmd=${1}

# Run cmd and log standard output (1) to log.<pid> and standard error (2) to err.<pid>.
$cmd 1>log.$$ 2>err.$$

# Copy the return code from cmd into result.
result=$?

# Test whether result is 0.
if [ $result -eq 0 ]; then
   echo "$cmd" succeeded.
   cat log.$$
else
   echo "$cmd" failed with result = $result!
   cat err.$$
fi

exit $result


# eof

$$ wertet die PID der Shell aus, sodass der Code parallel mit Kopien von sich selbst ausgeführt werden kann.

Rufen Sie das obige Skript so auf

$ run.sh "java myprogram"

1
2017-07-29 06:07



Vielen Dank für Ihre Antworten. Ich habe die Lösung mit folgendem Skript, aber ich weiß nicht, was hier passiert, Bitte erläutern Sie mir, was hier vor sich geht.

cmd="java EchoTest"

$cmd >log.$$ 2>err.$$

result=$?

if [ $result -eq 0 ]; then

   echo "1"

else

    echo "0"

   #echo $result

fi

rm log.$$ >/dev/null

rm err.$$ >/dev/null

0
2017-07-29 06:26