Es ist ganz einfach, einen Unix-Befehl von Java aus auszuführen.
Runtime.getRuntime().exec(myCommand);
Aber ist es möglich, ein Unix-Shell-Skript aus Java-Code auszuführen? Wenn ja, wäre es eine gute Praxis, ein Shell-Skript in Java-Code auszuführen?
Antworten:
Sie sollten sich Process Builder wirklich ansehen . Es ist wirklich für so etwas gebaut.
quelle
Sie können auch die Apache Commons Exec-Bibliothek verwenden .
Beispiel:
Zur weiteren Bezugnahme wird auch ein Beispiel für Apache Doc gegeben .
quelle
OutputStream
dassDefaultExecuter
dieDefaultExecuter.setStreamHandler
Methode zum Erfassen der Ausgabe in verwendet wirdOutputStream
. Weitere Informationen findenIch würde sagen, dass es nicht im Sinne von Java ist , ein Shell-Skript von Java aus auszuführen. Java soll plattformübergreifend sein, und das Ausführen eines Shell-Skripts würde seine Verwendung auf nur UNIX beschränken.
Vor diesem Hintergrund ist es definitiv möglich, ein Shell-Skript in Java auszuführen. Sie würden genau dieselbe Syntax verwenden, die Sie aufgelistet haben (ich habe es nicht selbst versucht, aber versuchen Sie, das Shell-Skript direkt auszuführen. Wenn dies nicht funktioniert, führen Sie die Shell selbst aus und übergeben Sie das Skript als Befehlszeilenparameter.) .
quelle
switches
undif
Aussagen schreiben , um all die Nuancen zu umgehen, die auf verschiedenen Plattformen trotz der besten Bemühungen der Leute, die die Java-Kernbibliotheken entwickelt haben, nicht genau gleich funktionieren.Ich denke, Sie haben Ihre eigene Frage mit beantwortet
Was ist eine gute Vorgehensweise? Was versuchen Sie mit einem Shell-Skript zu tun, das Sie mit Java nicht tun können?
quelle
Ja, das ist möglich. Das hat für mich geklappt.
quelle
Hier ist mein Beispiel. Hoffe es macht Sinn.
quelle
Ja, das ist möglich und du hast es beantwortet! In Bezug auf bewährte Methoden ist es meiner Meinung nach besser, Befehle aus Dateien und nicht direkt aus Ihrem Code heraus zu starten. So machen Sie müssen Java die Liste von Befehlen (oder einem Befehl) in einer bestehenden auszuführen
.bat
,.sh
,.ksh
... Dateien. Hier ist ein Beispiel für die Ausführung einer Liste von Befehlen in einer DateiMyFile.sh
:quelle
Um zu vermeiden, dass Sie einen absoluten Pfad fest codieren müssen, können Sie die folgende Methode verwenden, mit der Sie Ihr Skript finden und ausführen, wenn es sich in Ihrem Stammverzeichnis befindet.
quelle
Für mich müssen alle Dinge einfach sein. Zum Ausführen des Skripts muss nur ausgeführt werden
quelle
Die ZT Process Executor- Bibliothek ist eine Alternative zu Apache Commons Exec. Es verfügt über Funktionen zum Ausführen von Befehlen, Erfassen ihrer Ausgabe, Festlegen von Zeitüberschreitungen usw.
Ich habe es noch nicht benutzt, aber es sieht ziemlich gut dokumentiert aus.
Ein Beispiel aus der Dokumentation: Ausführen eines Befehls, Pumpen des stderr an einen Logger, Zurückgeben der Ausgabe als UTF8-Zeichenfolge.
In der Dokumentation sind die folgenden Vorteile gegenüber Commons Exec aufgeführt:
quelle
Hier ist ein Beispiel, wie Sie ein Unix-Bash- oder Windows-Bat / Cmd-Skript von Java aus ausführen. Argumente können an das Skript übergeben und vom Skript empfangen werden. Die Methode akzeptiert eine beliebige Anzahl von Argumenten.
Unter Unix / Linux muss der Pfad Unix-ähnlich sein (mit '/' als Trennzeichen), unter Windows '\' verwenden. Hier ist ein Beispiel für ein Bash-Skript (test.sh), das eine beliebige Anzahl von Argumenten empfängt und jedes Argument verdoppelt:
Beim Anruf
Unter Unix / Linux lautet die Ausgabe:
Hier ist ein einfaches cmd Windows-Skript test.cmd, das die Anzahl der Eingabeargumente zählt:
Beim Aufrufen des Skripts unter Windows
Die Ausgabe ist
quelle
Es ist möglich, es einfach wie jedes andere Programm auszuführen. Stellen Sie einfach sicher, dass Ihr Skript die richtige # hat! (she-bang) Zeile als erste Zeile des Skripts, und stellen Sie sicher, dass Ausführungsberechtigungen für die Datei vorhanden sind.
Wenn es sich beispielsweise um ein Bash-Skript handelt, setzen Sie #! / Bin / bash oben in das Skript, auch chmod + x.
Auch wenn es eine gute Praxis ist, nein, es ist nicht, besonders für Java, aber wenn es Ihnen viel Zeit spart, ein großes Skript zu portieren, und Sie dafür nicht extra bezahlt werden;) Sparen Sie Ihre Zeit, führen Sie das aus Skript, und setzen Sie die Portierung nach Java auf Ihre langfristige Aufgabenliste.
quelle
quelle
Dies ist eine späte Antwort. Ich dachte jedoch daran, den Kampf zu nehmen, den ich ertragen musste, um ein Shell-Skript für zukünftige Entwickler aus einer Spring-Boot-Anwendung auszuführen.
Ich habe in Spring-Boot gearbeitet und konnte die auszuführende Datei in meiner Java-Anwendung nicht finden
FileNotFoundFoundException
. Ich musste die Datei imresources
Verzeichnis behalten und die zu scannende Datei so einstellen, dasspom.xml
die Anwendung wie folgt gestartet wurde.error code = 13, Permission Denied
. Dann musste ich die Datei ausführbar machen, indem ich diesen Befehl ausführte -chmod u+x myShellScript.sh
Schließlich konnte ich die Datei mit dem folgenden Code-Snippet ausführen.
Hoffe, das löst jemandes Problem.
quelle
Genauso wie Solaris 5.10 so funktioniert,
./batchstart.sh
gibt es einen Trick, den ich nicht kenne, wenn Ihr Betriebssystem die Verwendung\\. batchstart.sh
stattdessen akzeptiert . Dieser doppelte Schrägstrich kann helfen.quelle
Ich denke mit
Durch Aktivieren des Betriebssystems können die Shell- / Bash-Skripte verwaltet werden, wenn dies unterstützt wird. wenn der Code portabel gemacht werden muss.
quelle
für Linux verwenden
und zur Verwendung;
ODER
quelle