ich möchte gerne auf einem UNIX System (Linux/Mac) die Shell aus meinem JAVA Programm per Button (Swing Sachen sind schon drin) hervorrufen und dort einen Pfad übergeben, bzw. setzen . Die Shell soll hinterher offenbleiben .
Es soll also quasi so eine ähnliche Funktion sein wie “Shell im aktuellen Ordner öffnen” die es in einigen UNIX systemen gibt, und die entspr. Shell mit dem Ordnerpfad öffnet wo man grade ist.
wie es in Windows geht weiss ich schon:
if (System.getProperty("os.name").toLowerCase().contains("win")) {
String path = getCurrentFolderName().toString();
ProcessBuilder b = new ProcessBuilder();
b.directory(new File(path));
b.command("cmd", "/k", "start");
b.start(); ```
aber ich weiss nicht genau wo bei mir der Fehler für die Shell holen unter UNIX liegt: ich hab schon diverses ausprobiert...
``` Runtime.getRuntime().exec("/bin/sh -k \"cd " + path);
new ProcessBuilder("xterm", "-e", "cd " +path).start();```
aber ich hab auch kein UNIX System hier zu hause installiert womit ich es testen könnte... :/ daher muss ein Freund das immer testen, ist ein bisschen umständlich...
weiss jemand was das Problem ist?
Was genau ist der Fehler?
Bekommst du eine Exception?
Öffnet sich keine Shell?
Öffnet sich eine Shell aber nicht im richtigen Verzeichnis?
Ich kann dir zwar grad nicht helfen, da ich auf der arbeit auch kein Linux habe aber eine etwas detailiertere Beschreibung des Fehlverhaltens wäre hilfreich
da öffnet sich mit Sicherheit keine “Konsole”, das erste startet nur eine Shell, ohne eine Konsole/Terminal dürfte es aber ziemlich sinnfrei sein, die zweite Version will “cd path” im xterm ausführen, was so auch nicht geht.
@Fred12 du musst vor allem wissen was für eine Konsole/Terminal auf dem Zielsystem installiert ist, um es “starten” zu können. Dann musst dich nur ein wenig mit Linux beschäftigen wie man das auch so ausführt, wie du möchtest.
//fuer OpenSuSE
String[] shellcom = {"konsole", "--workdir", path};
Process p;
ProcessBuilder builder;
try {
builder = new ProcessBuilder(shellcom);
p = builder.start();
xterm in einem bestimmten Verzeichnis, wie von der BASH interprätiert, startest du so: /usr/bin/xterm -e ‘cd $STARTDIR && /bin/bash’
Also hab mich zu Hause jetzt einmal hingesetzt und geschaut wie das ganze funktioniert.
Der erste versuch von dir die shell “/bin/sh” direkt aufzurufen kann nicht funktionieren, da eine shell kein eigenen Userinterface hat.
Was du brauchst ist einen terminal-emulator.
xterm waere z.B. ein solcher emulator. Da du aber nicht weist welcher Emulator auf dem System installiert ist, ( bei meinem Fedora 19 ist z.B. xterm nicht installiert sondern nur gnome-terminal) musst du dies zuvor ueberpruefen.
ich hab dir hier mal einen Code geschrieben, der dir unter Fedora 19 ein Terminal oeffnet.
du kannst auch den Pfad angeben. bei meinem Bsp. ist es das /home/ Directory
final ProcessBuilder pb = new ProcessBuilder(getTerminalEmulator());
pb.directory(new File("/home/"));
// redirect stdout, stderr, etc
final Process p = pb.start();
}
private static String getTerminalEmulator() throws IOException {
String[] emulators = new String[]{"xterm", "gnome-terminal"};
for (String emulator : emulators) {
final ProcessBuilder pb = new ProcessBuilder("whereis", emulator);
final Process p = pb.start();
BufferedReader st = new BufferedReader(new InputStreamReader(new BufferedInputStream(p.getInputStream())));
try {
p.waitFor();
} catch (InterruptedException e) {
}
String path = st.readLine();
System.out.println(path);
if (!path.trim().endsWith(":")){
return emulator;
}
}
return "";
}
Eine liste von terminal-emulatoren findest du in Wikipedia
EDIT: so hab nun VMWare mit Ubuntu 12.xx installiert zum testen,
im Moment hab ichs so gemacht : Es wird zwar die xterm shell aufgerufen, doch mit der Fehlermeldung: Could not exec /“path” : Keine Berechtigung
String shellcom[] = {"xterm" , path};
ProcessBuilder b = new ProcessBuilder(shellcom);
//b.directory(new File(path));
Process p ;
p = b.start();
weiss jemand wie ich es sonst noch machen könnte? wäre für jeden Ratschlag dankbar
naja dann wird wohl der Pfad als ein Programm ausgeführt, was nicht gehen kann,
ich hatte es aber davor schon mit deinem Programm versucht, und da kam irgendeine Fehlermeldung : null Pointer oder sowas, daher hab ichs nochmal anders gemacht…