我正在尝试用Java创建一个Unix shell。对于“cd”更改目录命令,一切都很有用。无论何时我尝试更改目录,它都会保留在同一目录中。
我看了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”命令时,它会显示我在我的项目目录中。
答案 0 :(得分: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();
}