Ich versuche zwei Dinge zu erreichen:
Ich führe cygwin unter Windows7 aus, um meine Unix-Shell-Befehle auszuführen, und ich muss den Prozess automatisieren, indem ich eine Java-App schreibe. Ich weiß bereits, wie man die Windows-Shell über Java verwendet, indem ich die 'Prozessklasse' und Runtime.getRuntime().exec("cmd /c dir")
verwende. Ich muss in der Lage sein, das gleiche mit Unix-Befehlen zu tun: z.B. ls -la
und so weiter. Worauf sollte ich achten?
Gibt es eine Möglichkeit, sich an den Zustand einer Shell zu erinnern?
Erklärung: Wenn ich: Runtime.getRuntime().exec("cmd /c dir")
verwende, erhalte ich immer eine Liste meines Home-Verzeichnisses. Wenn ich Runtime.getRuntime().exec("cmd /c cd <some-folder>")
und dann Runtime.getRuntime().exec("cmd /c dir")
wieder mache, erhalte ich immer noch die Liste meines Home-Ordners. Gibt es eine Möglichkeit, dem Prozess zu sagen, dass er sich an seinen Zustand erinnern soll, wie eine normale Shell?
Es scheint, dass die von Paŭlo vorgeschlagene Befehlszeile bash
nicht funktioniert:
Ich habe Probleme, die technischen Details herauszufinden.
Das ist mein Code:
%Vor% line
endet mit einem Nullwert.
Ich habe das zu meinem .bash_profile hinzugefügt:
%Vor%Ich habe auch Folgendes hinzugefügt:
Systemeigenschaften - & gt; fortgeschritten - & gt; Umgebungsvariablen - & gt; Benutzer variebales - & gt; Variable:
BASH
, Wert:c:\cygwin\bin
Immer noch nichts ...
Wenn ich das stattdessen ausführe, funktioniert es!
%Vor%1. Unix-Befehle aufrufen:
Sie müssen einfach Ihre Unix-Shell aufrufen (z. B. die mit cygwin ausgelieferte Bash) anstatt cmd
.
sollte tun. Wenn Ihr Befehl ein externes Programm ist, können Sie es natürlich einfach direkt aufrufen:
%Vor%Wenn Sie dies von Java aus starten, ist es am besten, die Variante zu verwenden, die ein String-Array verwendet Sie haben Java nicht parat, um zu sehen, wo die Argumente beginnen und enden:
%Vor% Die Fehlermeldung in Ihrem Beispiel ( ls: command not found
) scheint zu zeigen, dass Ihre bash den Befehl ls
nicht finden kann. Vielleicht müssen Sie es in die PATH-Variable einfügen (siehe oben für eine Möglichkeit, dies aus Java zu tun).
Vielleicht statt /cygdrive/c/cygwin/bin
wäre der richtige Verzeichnisname /usr/bin
.
(Hier ist alles ein wenig kompliziert, weil man zwischen Unix und Windows überbrücken muss) Konventionen überall.)
Der einfache Befehl ls
kann wie folgt aufgerufen werden:
2. Mehrere Befehle aufrufen:
Es gibt grundsätzlich zwei Möglichkeiten, mehrere Befehle in einer Shell aufzurufen:
Für den ersten Weg geben Sie einfach mehrere Befehle als Argument für die Option -c
, getrennt durch ;
oder \n
(eine neue Zeile), wie folgt:
oder aus Java (Anpassung des obigen Beispiels):
%Vor% Hier analysiert die Shell die Befehlszeile als und führt sie als Skript aus. Wenn es mehrere Befehle enthält, werden sie alle ausgeführt, wenn die Shell aus irgendeinem Grund nicht irgendwie beendet wird (wie ein Befehl exit
). (Ich bin mir nicht sicher, ob das Windows cmd
auf ähnliche Weise funktioniert. Bitte testen und melden.)
Anstatt die bash (oder cmd oder irgendeine Shell, die Sie benutzen) zu übergeben, müssen Sie die Befehle auf der Befehlszeile können Sie sie über den Eingabe-Stream Prozess übergeben.
-c
-Option noch ein Shell-Script-Dateiargument hat) liest Eingaben aus dem Stream und interpretiert die erste Zeile als einen Befehl (oder mehrere). exit
-Befehls (oder anderer Gründe zum Beenden) fortgesetzt. Hier wäre ein Beispiel dafür:
%Vor%Du brauchst Cygwin hier nicht. Es gibt mehrere reine Java-Bibliotheken, die das SSH-Protokoll implementieren. Benutze sie. BTW werden sie Ihr zweites Problem lösen. Sie öffnen die Sitzung und führen den Befehl mit derselben Sitzung aus, sodass der Shell-Status automatisch beibehalten wird.
Ein Beispiel wäre JSch .