【问题标题】:Java Unix Shell Changing DirectoriesJava Unix Shell 更改目录
【发布时间】:2013-10-21 11:07:21
【问题描述】:

我正在尝试用 Java 创建一个 Unix shell。对于“cd”更改目录命令,一切都很好。每当我尝试更改目录时,它都会保留在同一目录中。

我看了this 没有运气。

这是我正在使用的代码的 sn-p。

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”命令时,却显示我在我的项目目录下。

【问题讨论】:

    标签: java shell unix directory


    【解决方案1】:

    在 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();
    }
    

    【讨论】:

    • 感谢您的澄清!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-24
    • 1970-01-01
    • 2015-05-05
    • 2019-05-27
    • 1970-01-01
    • 2011-03-27
    • 2013-01-11
    相关资源
    最近更新 更多