# Terminal Befehl mit Java unter Mac ausführen



## klaesmann (9. Okt 2009)

Hallo!

Folgendes Problem:
Ich möchte einen Befehl mit Parametern in meinem Java Programm aufrufen.
Ich habe keine Ahnung wie ich das unter Mac bzw. UNIX machen kann. Hier der
Befehl: "./indesignserver -iorfile "/IDS/ior.txt" -pluginpath "server/corba"

Wie wäre denn der Java Befehl dazu?

Vielen Dank für Eure Hilfe!


----------



## AmunRa (9. Okt 2009)

Runtime (Java 2 Platform SE 5.0)


----------



## klaesmann (9. Okt 2009)

Leider öffnet er nur den Terminal. Führt aber den Befehl "ls -al" nicht aus. Wo liegt der Fehler?


```
try 
{
String [] command = new String [] {"ls","-al"};
Process process  = Runtime.getRuntime().exec("/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal",command);										  
System.out.println("");
} 
catch (IOException e1) 
{
// TODO Auto-generated catch block
Logging.logEventEntry("Fehler starten der Console !!!" + e1.toString());
}
```

Vielen Dank im voraus.


----------



## AmunRa (9. Okt 2009)

```
try 
    	{
    	String  command = "ls -lai";
    	Process process  = Runtime.getRuntime().exec(command);	
    	BufferedReader read= new BufferedReader (new InputStreamReader(process.getInputStream()));
    	String s;
    	while (( s=read.readLine())!=null)
     	System.out.println(s);
    	} 
    	catch (IOException e1) 
    	{
    	// TODO Auto-generated catch block
    		System.out.println(e1);
    	}
```


----------



## klaesmann (9. Okt 2009)

Vielen Dank für die schnelle Antwort.

Leider funzt mein Code mit einem String Array, der mehrere Befehle enthält nicht. Hier nocheinmal mein Code-Snippet:

Laut SUN kann ich auch einen Array ausführen. Ich bekomme aber keine Ausgabe und keine Exception.
Das Verzeichnis ist definitiv vorhanden.


```
try 
{
Runtime terminal = Runtime.getRuntime();
String [] cmd = new String [] {"cd \"/Applications/Adobe InDesign CS4 Server\" \n", "ls -lai \n"};
Process process = terminal.exec(cmd);										  
BufferedReader read = new BufferedReader (new InputStreamReader(process.getInputStream()));
String s;
while ((s = read.readLine()) != null)
{
	System.out.println(s);
}
  //DataOutputStream dOut = new DataOutputStream(process.getOutputStream());
  //dOut.writeChars("ls -al  \n");
	  
} 
 catch (IOException e1) 
 {
	// TODO Auto-generated catch block
Logging.logEventEntry("Fehler starten der Console !!!" + e1.toString());
}
```


----------



## Michael... (9. Okt 2009)

klaesmann hat gesagt.:


> ```
> String [] cmd = new String [] {"cd \"/Applications/Adobe InDesign CS4 Server\" \n", "ls -lai \n"};
> Process process = terminal.exec(cmd);
> ```


Dein Array enthält zwei Kommandos. Wenn Du dieses per exec ausführen lässt, deutet die Runtime den ersten Eintrag als Kommando und die nachfolgenden aus Argumente zu diesem Kommando.
Weiss nicht, ob das mit dem Listkommando auch funktioniert, aber vielleicht hilft ja:

```
Process process = terminal.exec("ls -lai hierstehtderPfad");
```


----------



## AmunRa (9. Okt 2009)

```
try 
    	{
    	String  command = "ls -lai /Applications/Adobe InDesign CS4 Server";
    	Process process  = Runtime.getRuntime().exec(command);	
    	BufferedReader read= new BufferedReader (new InputStreamReader(process.getInputStream()));
    	String s;
    	while (( s=read.readLine())!=null)
     	System.out.println(s);
    	} 
    	catch (IOException e1) 
    	{
    	// TODO Auto-generated catch block
    		System.out.println(e1);
    	}
```


----------



## klaesmann (9. Okt 2009)

Hallo!
Das Snippet hat funktioniert. Aber wie kann ich das ganze jetzt noch im Terminal ausführen?
Das unten beschriebene Code - Snippet funzt leider net. Bin da rahtlos.

```
try 
									{
										String [] cmd = new String [] {"/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal"};
										ProcessBuilder terminal = new ProcessBuilder(cmd);																					
										Process p = terminal.start();
										p.waitFor();
										DataOutputStream x = new DataOutputStream(p.getOutputStream());
										x.writeChars("cd \"/Applications/Adobe InDesign CS4 Server\"\n");
										x.writeChars("ls -al \n");																																									 
									} 
									catch (IOException e1) 
									{
											// TODO Auto-generated catch block
									  Logging.logEventEntry("Fehler starten der Console !!!" + e1.toString());
									} 
									catch (InterruptedException e2) 
									{
										// TODO Auto-generated catch block
										System.out.println("Error: " + e2.toString());
```


----------



## AmunRa (9. Okt 2009)

was willst du eigentlich machen ?


----------



## klaesmann (9. Okt 2009)

Ich möchte den Terminal öffnen.
In das Terminal Fenster folgende Befehle rein schreiben und ausführen:

(1) cd /Applications/Adobe InDesign CS4 Server
(2) ./indesignserver -iorfile "/IDS/ior.txt" -pluginpath "server/corba"

Die Befehle hinter (1) und (2) sind inclusive Anführungszeichen und Leerzeichen zu sehen.

Entschuldigung, für die Verwirrung.


----------



## AmunRa (9. Okt 2009)

warum möchtest du vorher in den Ordner wechseln?

und fürst nicht einfach das ganze in einem Befehl aus?
z.B.

/Applications/Adobe InDesign CS4 Server/indesignserver -iorfile "/IDS/ior.txt" -pluginpath "server/corba"

so etwa funktioniert das nicht?

```
try 
    	{
    	String  command = "/Applications/Adobe InDesign CS4 Server/indesignserver -iorfile \"/IDS/ior.txt\" -pluginpath \"server/corba\"";
    	Process process  = Runtime.getRuntime().exec(command);	
    	BufferedReader read= new BufferedReader (new InputStreamReader(process.getInputStream()));
    	String s;
    	while (( s=read.readLine())!=null)
     	System.out.println(s);
    	} 
    	catch (IOException e1) 
    	{
    	// TODO Auto-generated catch block
    		System.out.println(e1);
    	}
```


----------



## klaesmann (9. Okt 2009)

Folgende Fehlermeldung ist gekommen.

Fehler starten der Console !!! java.io.IOException: /Applications/Adobe: cannot execute


----------



## klaesmann (9. Okt 2009)

Ich möchte das ganze im Terminal ausführen, da dort Ausgaben seitens des Servers getätigt werden, die ich nicht extra in meinem Programm abfangen möchte.

Würde ich das ganze über den direkten Link 
<</Applications/Adobe InDesign CS4 Server/indesignserver -iorfile "/IDS/ior.txt" -pluginpath "server/corba">>
im Terminal machen, käem No such directory. Was an den Leerzeichen liegt.


----------



## AmunRa (9. Okt 2009)

leider weis ich nicht wie man das dann machen  sollte mit mhreren Befehlen in der Console 

aber das mit den Leerzeichen würde sich korrigieren wenn du vor jedes Lehrzeichen in der Pfadangabe einen Backslash machen würdes 

```
try 
        {
        String  command = "/Applications/Adobe\\ InDesign\\ CS4\\ Server/indesignserver -iorfile \"/IDS/ior.txt\" -pluginpath \"server/corba\"";
        Process process  = Runtime.getRuntime().exec(command);  
        BufferedReader read= new BufferedReader (new InputStreamReader(process.getInputStream()));
        String s;
        while (( s=read.readLine())!=null)
        System.out.println(s);
        } 
        catch (IOException e1) 
        {
        // TODO Auto-generated catch block
            System.out.println(e1);
        }
```

Was sollte denn passieren nachdem die Programme im Terminal ausgeführt werden?


----------



## Michael... (9. Okt 2009)

klaesmann hat gesagt.:


> Ich möchte den Terminal öffnen.
> In das Terminal Fenster folgende Befehle rein schreiben und ausführen


Das wird so mit reinem Java nicht funktionieren. Warum muss denn unbedingt ein Terminalfenster geöffnet werden?


----------



## klaesmann (9. Okt 2009)

Der Terminal ist die einzige Möglichkeit den InDesign Server mit PlugIn zu laden und zu starten.
Da ich das ganze aber GUI gesteuert machen möchte, und leider kein C kann,
habe ich es mit Java probieren wollen.

Wenn es aber so ohne weiteres nicht geht, dann muss ich das wohl lassen.

Dennoch vielen, vielen  Dank für die schnelle Hilfe.

Euch ein schönes WE.


----------



## Michael... (9. Okt 2009)

klaesmann hat gesagt.:


> Der Terminal ist die einzige Möglichkeit den InDesign Server mit PlugIn zu laden und zu starten.


Aber dazu musst Du doch kein Terminalfenster öffnen, sondern nur den korrekten Aufruf per Runtime.exec() ausführen.
Wie schaut denn der Aufruf im Terminalfenster aus?


----------



## klaesmann (12. Okt 2009)

Hallo!

Der Aufruf im Terminalfenster wäre:
Im Ordner "/Applications/Adobe InDesign CS4 Server" die Datei
"(./)indesignserver -iorfile "ior.txt" -pluginpath "server/corba" zu starten.

So der Aufruf. Nochmals Danke für Eure Hilfe.


----------



## thE_29 (12. Okt 2009)

Leitest du die Ausgabe wohin? Ansonsten mach doch einfach ein Shellscript..


----------

