2013-10-13 138 views
1

我正嘗試在Java中創建一個Unix shell。對於「cd」更改目錄命令,一切都很好。每次我嘗試更改目錄時,它都保留在同一個目錄中。Java Unix Shell更改目錄

我看了一下this沒有運氣。

這是我正在使用的代碼片段。

try 
{ 
    Process p = null; 
    File directory = new File("/Users/myName"); 
    if(inputList.get(0).equals("cd") 
    { 
     System.setProperty("user.dir", "Users/myName"); 
     System.out.println(System.getProperty("user.dir")); 
     ProcessBuilder pb = new ProcessBuilder("cd"); 
     pb.directory(directory); 
     System.out.println(pb.directory); 
     p = pb.start(); 
    } 
} 

請注意,打印getProperty命令時會返回正確的目錄地址。 另請注意,打印pb.directory()時,它也會打印出正確的目錄地址。 然而,當接下來執行「pwd」命令時,它顯示我在我的項目目錄中。

回答

2

在Unix中,當前工作目錄是特定進程的屬性。 Java不提供任何默認操作方法(「user.dir」屬性提供了一個相似但不相同的功能,即它是解析相對路徑名的位置,但它實際上並不控制Unix工作目錄)。您可以更改子進程的當前目錄 - 這就是您在發佈的代碼中使用ProcessBuilder.directory()所做的工作 - 但是子進程終止後,任何此類更改都不會被記住。

執行'cd'命令時,您試圖執行的操作是毫無意義的 - 該命令將更改其工作目錄,然後立即終止,並忘記所做的更改。

因此,您需要做的是在變量中跟蹤該目錄,並將其用作執行的每個後續命令的目錄。在代碼中,我期待看到類似這樣的內容:

if(inputList.get(0).equals("cd") 
{ 
    File newDirectory = new File(inputList.get(1)); 
    if (!newDirectory.exists() || !newDirectory.isDirectory()) 
      /* handle error here */ 
      .... 
    else 
      /* otherwise change is successful */ 
      directory = newDirectory 
    /* no need to actually start a process here */ 
} 
// ... 
else 
{ 
    ProcessBuilder pb = new ProcessBuilder(inputList.get(0)); 
    pb.directory(directory); 
    // .... 
    p = pb.start(); 
} 
+0

感謝您的澄清! – Dylan