1

Java で Unix シェルを作成しようとしています。「cd」ディレクトリ変更コマンドを除いて、すべてがうまく機能します。ディレクトリを変更しようとすると、常に同じディレクトリに残ります。

仕方なくこれを見てしまいました。

ここに私が使用しているコードのスニペットがあります。

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」コマンドを実行すると、プロジェクトのディレクトリにいることが示されます。

4

1 に答える 1

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();
}
于 2013-10-13T22:57:04.183 に答える