2015-11-07 263 views
-1

我試圖使用執行命令行,CD不起作用

try { 
     Process process = Runtime.getRuntime().exec(command); 
     BufferedReader stream = new BufferedReader(new InputStreamReader(process.getInputStream())); 
     String line; 
     while ((line = stream.readLine()) != null) { 
      stringBuilder.append(line); 
      stringBuilder.append('\n'); 
     } 
     stream = new BufferedReader(new InputStreamReader(process.getErrorStream())); 
     while ((line = stream.readLine()) != null) { 
      stringBuilder.append(line); 
      stringBuilder.append('\n'); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

ls工程執行cd。但是cd dir不起作用。它不會更改目錄。如果我執行pwd,它仍顯示/。我讀到每次執行Runtime.getRuntime().exec(command);時,它都會創建一個新的shell。我想我需要捕獲這個shell並且維護它,直到用戶關閉應用程序。

不僅如此,我沒有在我的輸出中得到任何錯誤。例如。當我放置一個不存在的命令時,我沒有收到錯誤信息。

+0

你還沒有描述什麼「不工作」在這裏的意思。它是否會拋出異常?由於'cd'命令不會輸出任何成功(不像'ls'),你怎麼知道它失敗了?另外 - 你試圖更改什麼目錄? Android對允許訪問哪些目錄有很多限制。 – adelphus

+0

我已經更新了答案。如果我嘗試「cd」到不存在的目錄,它也不會給我任何錯誤。任何想法,爲什麼我沒有收到錯誤信息? –

回答

1

我每次讀取Runtime.getRuntime()。exec(command);被執行, 它創建一個新的shell。

這是正確的。當您爲每個命令調用Runtime.exec()時,您正在創建一個新進程。每個進程都有自己的環境,包括一個不影響父進程(您的應用程序)的獨立工作目錄,或者其他您以後創建的進程。

我沒有得到任何錯誤,在我的輸出

因爲shell命令不會無法執行你沒有得到任何錯誤。當進程終止時,這些命令只會返回一個表示成功或失敗的狀態代碼 - 代碼可以通過Process.exitValue()獲得 - 但要確保使用Process.waitFor()的流程已完成。

如果要執行多個命令,可以使用exec()啓動shell可執行文件,然後通過輸入和輸出流編寫命令和讀取響應,或者只需使用分號將所有命令連接在一起,然後直接使用命令行如:

sh -c 'cd /;pwd'