2012-03-26 13 views
0

Ich habe getRuntime(). Exec() Aufrufe in meinem Programm; aber zwei von ihnen wird nicht funktionieren:getRuntime(). Exec (<command>): <command> funktioniert nicht

public static final ROTCW = "xrandr -o left" 
public static final CALCW1 = "xinput --set-prop 11 \"Evdev Axis Inversion\" 0 1" 
public static final CALCW2 = "xinput --set-prop 11 \"Evdev Axes Swap\" 1"; 

public void actionPerformed(ActionEvent e) 
{  
    try { 
     Runtime.getRuntime().exec(ROTCW); 
     Runtime.getRuntime().exec(CALCW1); 
     Runtime.getRuntime().exec(CALCW2);} 
    catch (IOException ioe){ ioe.printStackTrace();} 
}}); 

ROTCW funktioniert auf jeden Fall (der Bildschirm dreht cw), aber es funktioniert nicht kalibrieren (CALCW). Geben Sie die CALCWs manuell in das gleiche Terminal-Register ein wie das, mit dem ich das Programm gestartet habe, funktioniert nicht funktioniert, aber tippen Sie es in eine neue Terminal-Registerkarte/Fenster funktioniert funktioniert.

Warum passiert das und was behebt es?

+0

Probieren Sie es ohne Schale läuft, wie Sie mit exec tun. ;) –

+0

Uhm, ich vermute, du hast '... Sring ROTCW ...' in deinem eigentlichen Code. – aioobe

+0

Bearbeitet: es sieht wie && aus, was es bricht. – werdnanoslen

Antwort

2

Sie konnten die && Logik direkt in Java implementieren:

public static final String 
    ROTCW = "xrandr -o left", 
    CALCW1[] = {"xinput", "--set-prop", "11", "\"Evdev Axis Inversion\"", "0", "1"}, 
    CALCW2[] = {"xinput", "--set-prop", "11", "\"Evdev Axes Swap\"", "1"}; 

public void actionPerformed(ActionEvent e) 
{  
    try { 
     Runtime.getRuntime().exec(ROTCW).waitFor(); 
     Process p = Runtime.getRuntime().exec(CALCW1); 
     p.waitFor(); 
     if(p.exitValue() != 0) Runtime.getRuntime().exec(CALCW2); 
    } 
    catch (IOException ioe){ ioe.printStackTrace();} 
}}); 
+0

waitFor() half nicht, und rief auch nicht einfach .exec() für ROTCW, CALCW1 und CALCW2 auf. Trotzdem danke. – werdnanoslen

+1

Nun, da ich darüber nachdenke, macht es Sinn, ein anderes 'waitFor()' auf den 'ROTCW'-Prozess zu setzen (siehe Bearbeiten). Hast du das versucht? – trutheality

+1

Zur Verdeutlichung: Das 'waitFor()' im 'CALCW1'-Prozess soll sicherstellen, dass es beendet wird, bevor der Ausgangswert erhalten wird und entschieden wird, ob' CALCW2' aufgerufen werden soll. – trutheality

2

Versuchen Sie, eine Schale mit

public static final CALCW = "bash -c 'xinput --set-prop 11 \"Evdev Axis Inversion\" 0 1" + 
    " && xinput --set-prop 11 \"Evdev Axes Swap\" 1'" 

Zugabe && Um zu klären, ist eine Syntax für eine Shell und nur ein weiteres Argument für ein Programm.

+2

sollten Sie klarstellen, dass "&&" Shell-Syntax ist und deshalb müssen Sie mit "bash" ausführen. – jtahlborn

+0

Das hat bei mir nicht funktioniert, sowohl im Programm als auch manuell versucht. Gleiche Ergebnisse wie meine oben. – werdnanoslen

+0

Können Sie versuchen, die Ausgabe und Fehler abzurufen? Es wird wahrscheinlich einen Fehler ausgeben, den Sie verwerfen. –

0

Es ist alte Frage, aber ich finde nicht die Antwort, so dass ich eine Veröffentlichung.

Sie haben Array-Version von exec() verwenden und ohne Anführungszeichen in richtig Abschnitt des Befehls:

CALCW1[] = {"xinput", "set-prop", "11", "Evdev Axis Inversion", "0", "1"} 
Verwandte Themen