kostenloser Webspace werbefrei: lima-city


Shelldatei-Pfad mit Leerzeichen in Java ausführen

lima-cityForumProgrammiersprachenJava

  1. Autor dieses Themas

    jakarta

    Kostenloser Webspace von jakarta, auf Homepage erstellen warten

    jakarta hat kostenlosen Webspace.

    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.


  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. 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
  4. Nimm
    shellEx.execScript("\"/home/stephan/Dokumente/Test/Neuer Ordner/MeinSkript.sh\"");


    Beitrag zuletzt geändert: 8.7.2011 0:09:53 von drafed-map
  5. Autor dieses Themas

    jakarta

    Kostenloser Webspace von jakarta, auf Homepage erstellen warten

    jakarta hat kostenlosen Webspace.

    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
  6. 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.
  7. Autor dieses Themas

    jakarta

    Kostenloser Webspace von jakarta, auf Homepage erstellen warten

    jakarta hat kostenlosen Webspace.

    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
  8. 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.
  9. fatfox schrieb:
    try:
    Runtime.getRuntime().exec( "bash" + " " + "' /home/user/Dokumente/Neuer Ordner/ShellScript.sh'");
    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:
    Runtime.getRuntime().exec( "bash" + " " + "'/home/user/Dokumente/Neuer Ordner/ShellScript.sh'");
  10. Autor dieses Themas

    jakarta

    Kostenloser Webspace von jakarta, auf Homepage erstellen warten

    jakarta hat kostenlosen Webspace.

    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
  11. drafed-map schrieb:
    fatfox schrieb:
    try:
    Runtime.getRuntime().exec( "bash" + " " + "' /home/user/Dokumente/Neuer Ordner/ShellScript.sh'");
    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:
    Runtime.getRuntime().exec( "bash" + " " + "'/home/user/Dokumente/Neuer Ordner/ShellScript.sh'");


    Oh richtig, das hatte ich übersehen was ich meinte war:
    Runtime.getRuntime().exec( "bash" + " '/home/user/Dokumente/Neuer Ordner/ShellScript.sh'");
    allerdings ist die Variante mit separaten Leerzeichen deutlich besser zu lesen, man verzeihe mir meinen Fehler.
  12. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    Wozu willst du überhaupt ein Shellscript mit dem Kommando
    bash /pfad/zum/shellscript.sh
    ausführen? Schreib im Shellscript in der 1. Zeile
    #!/bin/sh
    mach die Datei mit
    chmod +x /pfad/zum/shellscript.sh
    ausführbar und ruf sie aus Java einfach mit
    Runtime.getRuntime().exec("/pfad/zum/shellscript.sh");
    auf. Dabei sollte es funktionieren, wenn man für dein Skript folgendes schreibt:
    Runtime.getRuntime().exec("'/home/user/Dokumente/Neuer Ordner/ShellScript.sh'");
  13. Autor dieses Themas

    jakarta

    Kostenloser Webspace von jakarta, auf Homepage erstellen warten

    jakarta hat kostenlosen Webspace.

    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
  14. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    Ich habe gerade folgendes unter Windows mit msys getestet:
    Runtime.getRuntime().exec("bash \'/e/test folder/test.sh\'").waitFor();
    Dabei ist in test.sh folgendes gestanden:
    echo 'Hello world' > test.txt
    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.
    Falls du darauf wartest das das Kommando
    echo 'test text'
    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.
  15. Autor dieses Themas

    jakarta

    Kostenloser Webspace von jakarta, auf Homepage erstellen warten

    jakarta hat kostenlosen Webspace.

    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 ;-)
  16. 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
  17. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    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.
  18. Autor dieses Themas

    jakarta

    Kostenloser Webspace von jakarta, auf Homepage erstellen warten

    jakarta hat kostenlosen Webspace.

    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.
  19. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    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.
    Process Runtime.exec(String[] cmd);
    existiert auch noch.
  20. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!