Shelldatei-Pfad mit Leerzeichen in Java ausführen
lima-city → Forum → Programmiersprachen → Java
antwort
code
dank
datei
dokument
funktionieren
jemand
konsole
objekt
ordner
pfad
problem
programm
shell
string
system
test
text
url
zeichen
-
Hi,
ich möchte mit einer Java-Klasse ein Shell-Skript ausführen.
Ich gebe einen Datei-Pfad an, der ein Leerzeichen enthält und deshalb interpretiert die Shell das als 2 Eingaben.
Ich habe nun den Datei-Pfad mit Anführungszeichen versehen, nur macht die Klasse immer noch nichts.
Wenn ich die Befehlszeile in der Konsole ausführe, funktioniert alles super.
Hat jemand eine Antwort darauf?
Hier kommt der Java-Code:
import java.io.*; public class ShellExecute { //Variablen initialisieren private String scriptFilePath; private String shellName; //Konstruktor public ShellExecute( String nameShell ) { //Den Namen der Shell setzen: "bash" this.setShellName( nameShell ); } public static void main( String[] args ) { //Objekt erstellen ShellExecute shellEx = new ShellExecute("bash"); //Das Shell-Skript ausfuehren shellEx.execScript("/home/stephan/Dokumente/Test/Neuer Ordner/MeinSkript.sh"); } public void execScript( String filePath ) { //Den Datei-Pfad initialisieren this.setScriptFilePath( filePath ); try { //Nur ausfuehren, wenn Datei-Pfad und Shell-Name korrekt sind if( (new File ( this.getScriptFilePath() ).isFile() ) && ( !this.getShellName().isEmpty() ) ) { //Ausgeben, was ausgefuehrt wird System.out.println( this.getShellName() + " " + this.addQuotation(this.getScriptFilePath()) ); //Shell-Skript ausfuehren; falls Leerzeichen im Pfad Anfuehrungszeichen anfuegen Runtime.getRuntime().exec( this.getShellName() + " " + this.addQuotation(this.getScriptFilePath()) ).waitFor(); System.out.println("Fertig"); } } catch(Exception Ex) { Ex.printStackTrace(); } } //Methode zum Anfuegen von Anfuehrungszeichen public String addQuotation(String filePath) { if(filePath.contains(" ")) { filePath = "\'" + filePath + "\'"; } return filePath; } public String getScriptFilePath() { return this.scriptFilePath; } public void setScriptFilePath( String filePath ) { this.scriptFilePath = filePath; } public String getShellName() { return this.shellName; } public void setShellName( String nameShell ) { this.shellName = nameShell; } }
Also, falls jemand eine Antwort weiß, bedanke ich mich jetzt schon mal dafür.
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Hey ;)
Ich bin atm nicht unter Linux online und habe deinen Code nicht getestet, aber könnte es sein, dass die Shell vor jedem Abstand einen BackSlash will?
Dein Pfad sähe dann so aus:
/home/stephan/Dokumente/Test/Neuer\ Ordner/MeinSkript.sh
Ich kann auch nur raten xD
Probier's einfach aus, vielleicht geht's ja ;)
lg
Sincer -
Nimm
shellEx.execScript("\"/home/stephan/Dokumente/Test/Neuer Ordner/MeinSkript.sh\"");
Beitrag zuletzt geändert: 8.7.2011 0:09:53 von drafed-map -
He,
danke für die Antworten.
In der Konsole funktioniert das mit den Anführungszeichen super, nur bei dem Java-Programm geht es nicht ;-(
Mir wurde gesagt, dass die Shell Leerzeichen auch als %20 oder so ähnlich interpretieren.
In URLs werden zumindest Leerzeichen so interpretiert.
Weiß jemand, ob es wirklich %20 ist oder wie es überhaupt in URLs verarbeitet wird, da die Shell ja das auch in Java so möglich wäre.
Da ich mit dem Befehl:
Runtime.getRuntime().exec( "Bash" + " " + "/home/user/Dokumente/Neuer Ordner/ShellScript.sh");
die Shell-Datei ausführe, kann ich aber nicht sehen, was mir die Konsole als Antwort auf den Befehl ausgibt!
Kann ich mit der Pipe die Antwort der Shell in eine neue Datei schreiben??
Also so:
Runtime.getRuntime().exec( "Bash" + " " + "/home/user/Dokumente/Neuer Ordner/ShellScript.sh" + " | > /home/user/Dokumente/neueDatei );
Danke schon mal für die Hilfe
Beitrag zuletzt geändert: 8.7.2011 11:58:57 von jakarta -
Wenn du in einer Pfadangabe ein Leerzeichen verwendest, dann musst du den Pfad zwischen doppelte Anführungszeichen schreiben. Die äußeren doppelten Anführungszeichen bezeichnen nur den String, sind aber nicht Teil des Strings. Deswegen musst du nochmals doppelte Anführungszeichen verwenden, diese aber escapen, damit der Compiler keinen leeren String + irgendetwas unverständliches + nochmal einen leeren String, sieht, sondern eben einen String, der mit einem doppelten Anführungszeichen beginnt und wieder mit einem endet. Also so, wie ich es gemacht habe.
Doppelte Anführungszeichen sind diese hier:
und nicht zwei davon, damit du das nicht falsch verstehst."
%20 dürfte eigentlich nicht funktionieren. -
Ja,
genau das hab ich auch schon probiert mit:
Runtime.getRuntime().exec( "Bash" + " " + "\"/home/user/Dokumente/Neuer Ordner/ShellScript.sh\"");
Ich hab es also mit \" und mit \' probiert.
In der Shell funktioniert es mit den Hochkommata ( ' ) genauso wie mit den Anführungszeichen ( " ), aber in Java leider nicht
Wahrscheinlich ist das ein Fehler in Java,
aber Danke für die Antworten
Beitrag zuletzt geändert: 8.7.2011 16:58:09 von jakarta -
try:
Runtime.getRuntime().exec( "bash" + " " + "' /home/user/Dokumente/Neuer Ordner/ShellScript.sh'");
...und nein es ist kein Fehler in Java, das was du da bisher versucht hast klappt nirgends. -
fatfox schrieb:
Das wird nicht funktionieren, da vor der Pfadangabe ein Leerzeichen steht. Sind Anführungszeichen da, dann darf das nicht sein. Ich habe es gerade auch in der Konsole ausprobiert. Wenn, dann so:
try:
Runtime.getRuntime().exec( "bash" + " " + "' /home/user/Dokumente/Neuer Ordner/ShellScript.sh'");
Runtime.getRuntime().exec( "bash" + " " + "'/home/user/Dokumente/Neuer Ordner/ShellScript.sh'");
-
als ich habe nun noch mal in einer Java-Klasse alle Möglichkeiten probiert:
import java.io.*; public class ShellExe { //Konstruktor public ShellExe() { execScript(); } public static void main( String[] args ) { new ShellExe(); } public void execScript() { try { //Mit '-Zeichen ausfuehren System.out.println("bash" + " " + "'/home/stephan/Dokumente/Test/Neuer Ordner/MeinSkript.sh'"); Runtime.getRuntime().exec( "bash" + " " + "'/home/stephan/Dokumente/Test/Neuer Ordner/MeinSkript.sh'" ).waitFor(); //Mit - \"-Zeichen ausfuehren System.out.println("bash" + " " + "\"/home/stephan/Dokumente/Test/Neuer Ordner/MeinSkript.sh\""); Runtime.getRuntime().exec( "bash" + " " + "\"/home/stephan/Dokumente/Test/Neuer Ordner/MeinSkript.sh\"" ).waitFor(); //Mit \'-Zeichen ausfuehren System.out.println("bash" + " " + "\'/home/stephan/Dokumente/Test/Neuer Ordner/MeinSkript.sh\'"); Runtime.getRuntime().exec( "bash" + " " + "\'/home/stephan/Dokumente/Test/Neuer Ordner/MeinSkript.sh\'" ).waitFor(); } catch(Exception Ex) { Ex.printStackTrace(); } } }
Ich bin ja selten pessimistisch, aber ich glaube das funktioniert überhaupt nicht / bzw. bei mir nicht.
Na gut, Danke schön für die tolle Unterstützung
Falls doch noch jemand zufällig auf eine Lösung für das Problem stößt, kann er/sie es hier gerne posten
ps: In der Konsole funktioniert echt alles super, nur halt im Java-Programm nicht -
drafed-map schrieb:
fatfox schrieb:
Das wird nicht funktionieren, da vor der Pfadangabe ein Leerzeichen steht. Sind Anführungszeichen da, dann darf das nicht sein. Ich habe es gerade auch in der Konsole ausprobiert. Wenn, dann so:
try:
Runtime.getRuntime().exec( "bash" + " " + "' /home/user/Dokumente/Neuer Ordner/ShellScript.sh'");
Runtime.getRuntime().exec( "bash" + " " + "'/home/user/Dokumente/Neuer Ordner/ShellScript.sh'");
Oh richtig, das hatte ich übersehen was ich meinte war:
allerdings ist die Variante mit separaten Leerzeichen deutlich besser zu lesen, man verzeihe mir meinen Fehler.Runtime.getRuntime().exec( "bash" + " '/home/user/Dokumente/Neuer Ordner/ShellScript.sh'");
-
Wozu willst du überhaupt ein Shellscript mit dem Kommando
ausführen? Schreib im Shellscript in der 1. Zeilebash /pfad/zum/shellscript.sh
mach die Datei mit#!/bin/sh
ausführbar und ruf sie aus Java einfach mitchmod +x /pfad/zum/shellscript.sh
auf. Dabei sollte es funktionieren, wenn man für dein Skript folgendes schreibt:Runtime.getRuntime().exec("/pfad/zum/shellscript.sh");
Runtime.getRuntime().exec("'/home/user/Dokumente/Neuer Ordner/ShellScript.sh'");
-
He,
danke für die Antwort.
Das Problem liegt nicht im "bash" sondern, wenn so was passiert:
Runtime.getRuntime().exec( "bash" + " '/home/user/Dokumente/Dieser Ordner enthaelt Leerzeichen/ShellScript.sh'");
Also, wenn ein Ordner-Name Leerzeichen enthält.
Die bash nimmt das dann als 2 Befehle an...
Aber danke für die Antwort.
Bei meinem nächsten Shell-Skript denke ich an das:
#! /bin/sh
Beitrag zuletzt geändert: 10.12.2011 18:34:10 von jakarta -
Ich habe gerade folgendes unter Windows mit msys getestet:
Dabei ist in test.sh folgendes gestanden:Runtime.getRuntime().exec("bash \'/e/test folder/test.sh\'").waitFor();
Nach dem Ausführen des Java-Programms hat die Datei test.txt existiert und den erwarteten Inhalt gehabt. Ich verstehe daher das Problem nicht ganz.echo 'Hello world' > test.txt
Falls du darauf wartest das das Kommando
im Shellscript den Text auf die Konsole schreibt wenn du das Script aus Java aus aufrufst muss ich dich entteuschen, das wird nicht funktionieren. Statdessen bekommst du von Runtime.getRuntime().exec ein Objekt (Process) zurück von dem du einen InputStream holen kannst. Wenn du nun aus diesem InputStream liest wirst du den 'test text' bekommen. Er wird aber niemals direkt vom Script auf die Konsole geschrieben werden.echo 'test text'
-
Also ich hab das ganze in zig Versionen noch einmal getestet und es passiert nichts.
Mit in der Shell funktioniert alles super. Also liegt das Problem in der Übermittlung des Strings zur Shell.
Ich habe in meiner Shelldatei eine mkdir-Anweisung hineingeschrieben.
Nun ja, die einzigste Möglichkeit, die ich noch sehe, ist, dass man die ganzen String ("bash + Pfad") in eine temp. Shelldatei speichert und diese temp. Shelldatei ausführt.
Diese temp Shelldatei kann man ja im $HOME Verzeichnis speichern.
Nun gut, danke für die Anwort -
Hallo jakarta,
hast Du schon einmal versucht vor jedem Leerzeichen im Pfad ein '\' (Backslash) einzufügen?
Wenn man in der Bash (Konsole) Pfade mit Leerzeichen hat, dann funktioniert das zumindest.
Also:
/home/user/Dokumente/Neuer\ Ordner/ShellScript.sh
-
Hast du auch darauf geachtet, dass das Shellscript nicht in dem Ordner ausgeführt wird wo es auch gespeichert ist?
Heißt: dein Shellscript sollte im gleichen Ordner wie deine Java-Datei den Ordner erstellen (erstellt haben) und nicht im Ordner wo das Script selbst gespeichert ist (außer du verwendest absolute Pfadangaben im Script).
Aktueller Ordner des Scriptes = aktueller Ordner des Java-Programms. -
Es geht immer noch nicht!
Es könnte ja mal jemand anders sowas probieren und dann posten, ob es bei ihm funktioniert hat.
Das Projekt ist aber eigentlich schon geschlossen. Wäre halt bloß super eine Lösung dafür zu finden
Danke für die Mithilfe. -
Du könntest noch versuchen ein Script zu schreiben das eine sichtbare Veränderung auf dem Bildschirm hervorruft (z.B. irgend ein Programm startet). Dann kannst du dir sicher sein ob das Script selbst ausgeführt wird oder ob du nur die Ausgabe vom Script nicht siehst.
Sonst könntest du noch versuchen den InputStream vom Process-Objekt zu holen und aus ihm lesen. Möglicherweise findest du dort eine Fehlermeldung.
Du könntest auch noch den Errorcode vom Script/Shell abfragen mit exitValue().
Möglicherweise ist das auch noch nützlich:Process p = new ProcessBuilder("bash", "/pfad/zum/script mit/leerzeichen.sh").start();
dann kannst du dir sicher sein dass der Pfad mit Leerzeichen als 1 Argument übergeben wird.
existiert auch noch.Process Runtime.exec(String[] cmd);
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage