2016-12-18 4 views
0

Dies ist eine Linux-Maschine und der folgende Code führt zu keiner Ausgabe, ich bin neugierig, warum. P.S. - Ich habe nicht gelesen, dass die Tilde entkoppelt werden muss, aber in jedem Fall wurde die Tilde mit einem Backslash entfernt und javac hat auf den Syntaxfehler hingewiesen.Runtime.getRuntime(). Exec ("ls ~") listet nicht den Inhalt des Home-Verzeichnisses

import java.io.IOException; 
import java.io.BufferedReader; 
import java.io.InputStreamReader; 

class Run { 
    public static void main(String args[]) throws IOException { 
     Process p = Runtime.getRuntime().exec("ls ~"); 
     BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream())); 
     String line; 

     while ((line = br.readLine()) != null) { 
      System.out.println(line); 
     } 
    } 
} 
+1

'~' von der Shell interpoliert wird. – chrylis

+0

'Process Prozess = Runtime.getRuntime(). Exec (neue String [] {"/bin/sh "," -c "," ls ~ "});' um Ihre Shell aufzurufen und erweitern Sie die '~' vor dem Passieren es zu 'ls'. – teppic

+0

Siehe auch [Wenn Runtime.exec() nicht wird] (http://www.javaworld.com/article/2071275/core-java/when-runtime-exec---won-t.html) für viele gut Tipps zum korrekten Erstellen und Bearbeiten eines Prozesses. Dann ignoriere es auf 'exec' und verwende einen' ProcessBuilder' um den Prozess zu erstellen. Unterteilen Sie auch einen 'String arg' in' String [] args', um Dinge wie Pfade mit Leerzeichen zu berücksichtigen. –

Antwort

1

Das ist, weil ~ mit dem Pfad zu Ihrem Home-Verzeichnis durch den Shell ersetzt. Sie verwenden die Shell nicht. Stattdessen ist es wie du ls '~' lief, was den Fehler verursacht:

ls: cannot access '~': No such file or directory 

In der Tat kann man sehen, dass passieren, wenn Sie p.getInputStream()-p.getErrorStream() ändern, die Ihr Programm Ausgabe macht:

ls: cannot access '~': No such file or directory 
1

Sie müssen ~ von der Shell interpoliert, um den Home-Ordner zu erhalten, stattdessen können Sie die user.home von Systemeigenschaften wie

lesen
Process p = Runtime.getRuntime().exec("ls " + System.getProperty("user.home")); 

Man könnte es auch tun, mit einem ProcessBuilder wie

ProcessBuilder pb = new ProcessBuilder("ls", System.getProperty("user.home")); 
pb.inheritIO(); 
try { 
    pb.start().waitFor(); 
} catch (InterruptedException e) { 
    e.printStackTrace(); 
} 
Verwandte Themen