PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Shell-B. m. Pipes von Java



zagadka
28-03-2003, 23:26
Hallo,

ich würde gerne von Java aus folgenden Befehl auf der Shell ausführen.

echo der text für die sprachausgabe | txt2pho -m | mbrola -t 2 /usr/local/mbrola/de1/de1 - - | bplay -s 16000 -b 16

Mit einfachen Kommandos haut das hin (s.unten), aber mit Pipes etc. wird das Debuggen schwierig. Für Tipps, woran es hängt oder wie sich das Ganze Debuggen läßt wäre ich dankbar.


Rupert


try
{
// command steht hier für den String der in Sprache umgewandelt wird über das Shell-Skript txt2snd -s;
command = command.replaceAll(" ", "_");
command = "txt2snd -s " + "\"" + command + "\"";
System.out.println(command);
Process proc = Runtime.getRuntime().exec(command);
proc.waitFor();
} catch (Exception e){System.err.println(" ...

peschmae
29-03-2003, 09:26
afaik gehen pipes mit java so nicht

ich schreib das zeugs immer in ein (ba)sh - Script und führe dann dieses aus

MfG Peschmä

anda_skoa
29-03-2003, 11:09
Ich glaube die Pipe Zeichen müssen von einer Shell interpretiert werden.
D.h. mn könnte versuchen, den momentanen Befehl als Argument von sh -c auszuführen.

Eventuell mit dem exec Befehl, der ein String Array als Parameter nimmt
["sh",
"-c",
"echo der text für die sprachausgabe | txt2pho -m | mbrola -t 2 /usr/local/mbrola/de1/de1 - - | bplay -s 16000 -b 16"]

Ciao,
_

peschmae
29-03-2003, 18:54
richtig,

ich habs dann eigentlich auch so gemacht, hatte nur noch die "Debug" - Variante in erinnerung, da ich anfangs mit dem script probleme hatte

du könntest natürlich auch die programme einzeln als Prozesse starten und dann in Java stdins und stdouts verknüpfen, aber das ist wohl eher lahm

MfG Peschmä

zagadka
30-03-2003, 18:40
Danke erstmal für die Tipps!

Ich habe das jetzt folgendermaßen "gelöst", warum ist mir aber noch nicht ganz klar (String[], anstatt String, warum Feld?) ...

// shellbefehl kann natürlich auch direkt in command stehen
String shellbefehl ="echo eins zwo aus! | txt2pho -m | mbrola -t 2 /usr/local/mbrola/de1/de1 - - | bplay -s 16000 -b 16" ;

String[] command ={ "/bin/bash", "-c", shellbefehl };
Runtime runtime = Runtime.getRuntime();
Process process = null;
try
{
process = runtime.exec(command);
// DataInputStream in = new DataInputStream(process.getInputStream());
// String line = null;
// while ((line = in.readLine()) != null) { System.out.println(line); }
} catch (Exception e) { System.out.println("Probleme .... ") ;}

Rupert

anda_skoa
30-03-2003, 19:49
Original geschrieben von zagadka
Danke erstmal für die Tipps!

Ich habe das jetzt folgendermaßen "gelöst", warum ist mir aber noch nicht ganz klar (String[], anstatt String, warum Feld?) ...


Alles was du als Kommand übergibst, geht an eine Shell.

Für eine Shell beginnt bei einem Leerzeichen ein neuer Parameter.

Wenn du also am normalen Shell Prompt eine shell mit .-c ls -l aurufen willst, musst du es so machen:

#> sh -c "ls -l"

Um der Shell zu sagen, dass -l kein eigener Parameter von sh ist.

Das normale exec(command) tut etwas ähnliches wie
#> "command"

Daher würden deine Anführungszeichen praktisch aufgehoben werden.

Mit dem Array kannst du angeben, wie die Parameter weiter gegeben werden sollen.
Also aus exec([aaaa, bbbb, cccc]) würde in etwas das werden
#> "aaaa" "bbbb" "cccc"

Also genau die Gruppierung, die du möchtest.

Ich hoffe das war halbwegs verständlich.

Ciao,
_