2010-03-29 5 views
5

ich einen Shell-Befehl von Process-Klasse aufrufen aus Java und er drucktvon Java, es Beschwerden „stty: Standardeingabe: Invalid argument“ Aufrufen der Shell

"stty: standard input: Invalid argument" 

egal, ob der Befehl richtig oder falsch ist (normal Ausgabe des Shell-Befehls wird ebenfalls angezeigt). Wenn ich den Shell-Befehl in der Shell ausführen, wird keine solche Fehlermeldung angezeigt.

Der Befehl ist so etwas wie dieses: {"/bin/csh", "-c", "echo hello"}

+1

In einem solchen Fall wird ein Beispiel-Code wäre tolle Hilfe. – Riduidel

+0

Ich habe nichts als sehr einfache Dinge, um "Echo Hallo" aus Java aufzurufen. Dieser Code läuft in Ordnung vor einigen Wochen, so denke ich etwas falsch mit meinem Bash vor kurzem, nicht Java – solotim

+0

Ich glaube, es gibt Möglichkeiten in Java, Betriebssystemfunktionen durchzuführen, und es gibt keine Notwendigkeit, Systembefehle aufzurufen. Welchen Befehl rufst du an, dass Java kein Modul dafür hat? – ghostdog74

Antwort

3

Versuchen Sie es mit der -f Option von csh ausführen, um das Lesen der .chsrc zu deaktivieren und .login-Dateien:

{"/bin/csh", "-cf", "echo hello"} 
+0

Es kann funktionieren. Aber der Benutzer mag das nicht. – solotim

+0

@solotim: warum nicht? Wenn es jedoch funktioniert, deutet dies darauf hin, dass das Skript .cshrc oder .login versucht, das Terminal anzupassen, ohne zu prüfen, ob es ein solches gibt. Der nächste Schritt sollte sein, diese Prüfung den Skripten hinzuzufügen ... –

6

Sie den Aufruf des stty Befehl von Ihrem .profile oder .bash_profile. Sie müssen den Standardfehler auf /dev/null umleiten.

stty blah blah blah 2>/dev/null 

stty kann nicht mit dem pseudo-tty befassen, die Java in Beschuss aus bietet.

+0

Danke, aber wofür steht Blah? – solotim

+1

Es ist egal, wofür es steht. Das Aufrufen von stty in einem Kontext, in dem es kein tty gibt, wie zum Beispiel ein exec-Prozess, ist falsch. Du kannst es nicht tun. – EJP

0

Quoth der Dokumentation java.lang.Process:

„Die Methoden, die Prozesse erstellen können nicht gut für spezielle Prozesse auf bestimmten nativen Plattformen wie nativen Windowing-Prozesse, Daemon Prozesse, Win16/DOS Prozesse auf Microsoft Windows oder Shell-Skripte. Der erstellte Subprozess hat seine eigene Terminal oder Konsole. "

Vielleicht möchten Sie stattdessen die java.lang.ProcessBuilder.

+0

Danke. Aber eigentlich habe ich auch ProcessBuilder benutzt, es ergeben sich die gleichen Ergebnisse. – solotim

0

Schauen Sie hier. ich es geschafft, einige Befehle wie this