Heim >Java >javaLernprogramm >Warum führt „Runtime.exec(String)' manchmal Befehle nicht korrekt aus?

Warum führt „Runtime.exec(String)' manchmal Befehle nicht korrekt aus?

Susan Sarandon
Susan SarandonOriginal
2024-12-05 22:22:10456Durchsuche

Why Does `Runtime.exec(String)` Sometimes Fail to Execute Commands Correctly?

Warum verhält sich Runtime.exec(String) bei bestimmten Befehlen anders?

Runtime.exec(String) ermöglicht die Ausführung von Befehlen in die Umgebung des zugrunde liegenden Betriebssystems. Während es jedoch bei einigen Befehlen reibungslos funktioniert, treten bei anderen Probleme auf.

Warum der Unterschied?

Der Hauptunterschied ergibt sich aus der Tatsache, dass die Befehle nicht ausgeführt werden in einer Shell-Umgebung. Die Shell stellt wesentliche Dienste bereit, die nicht von Runtime.exec(String) ausgeführt werden, was zu Fehlern führt.

Wann tritt ein Fehler auf?

Befehle schlagen fehl, wenn sie darauf angewiesen sind auf Shell-Funktionen, wie zum Beispiel:

  • Korrekte Aufteilung von Anführungszeichen und Leerzeichen: Runtime.exec(String) teilt sich naiv in Leerzeichen auf, was Argumente wie „Meine Datei.txt“ in separate Dateinamen aufteilen kann.
  • Erweitern von Globs und Platzhaltern: Die Shell schreibt Muster wie *.doc in die eigentlichen Dateien um. Runtime.exec(String) führt diese Erweiterung nicht durch.
  • Handhabung von Pipes und Umleitungen: Die Shell richtet eine Ausgabeumleitung ein, die Runtime.exec(String) nicht verarbeitet.
  • Variablen und Befehle erweitern: Die Shell ersetzt Shell-Variablen und Befehle, bevor der Befehl ausgeführt wird. Runtime.exec(String) übergibt sie wörtlich.

Lösungen

Es gibt zwei Ansätze, mit dieser Situation umzugehen:

An eine Shell delegieren (einfach, aber schlampig):

Befehle an eine Shell übergeben (z. B. mit Runtime.exec(String[])):

String myCommand = "cp -R '" + myFile + "' $HOME 2> errorlog";
Runtime.getRuntime().exec(new String[] { "bash", "-c", myCommand });

Übernahme von Shell-Verantwortungen (sicher und robust):

Verwendung von ProcessBuilder zur Handhabung der Shell -ähnliche Aufgaben wie Variablenerweiterung, Umleitung und Wortaufteilung:

String myFile = "some filename.txt";
ProcessBuilder builder = new ProcessBuilder(
    "cp", "-R", myFile,
    System.getenv("HOME")
);
builder.redirectError(ProcessBuilder.Redirect.to(new File("errorlog")));
builder.start();

Das obige ist der detaillierte Inhalt vonWarum führt „Runtime.exec(String)' manchmal Befehle nicht korrekt aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn