寻找以前的工作目录来实现" cd - "

时间:2014-02-05 16:01:38

标签: java shell directory cd

我目前正在使用Java编程语言实现一个功能有限的shell。 shell的范围也限制了要求。我的任务是尽可能多地为Unix shell建模。

当我实现cd命令选项时,我引用了一个Basic Shell Commands page,它提到cd能够使用命令“cd - ”返回到我所在的最后一个目录。

因为只给出了方法public String execute(File presentWorkingDirectory, String stdin)的接口。

我想知道是否存在来自Java的API调用,我可以检索以前的工作目录,或者该命令是否有任何实现?

我知道其中一个简单的实现是声明一个变量来存储以前的工作目录。但是我现在拥有shell本身(带有选项的命令),每次执行命令工具时,都会创建一个新线程。因此,我认为“主”线程不建议存储以前的工作目录。

更新(2014年3月6日):感谢您的建议!我现在已经与编码器讨论了shell,并添加了一个额外的变量来存储以前的工作目录。以下是共享的示例代码:

public class CdTool extends ATool implements ICdTool {
    private static String previousDirectory;

    //Constructor
    /**
     * Create a new CdTool instance so that it represents an unexecuted cd command. 
     * 
     * @param arguments
     *  the argument that is to be passed in to execute the command
     */
    public CdTool(final String[] arguments) {
        super(arguments);
    }

    /**
     * Executes the tool with arguments provided in the constructor
     * 
     * @param workingDir
     *            the current working directory path
     * 
     * @param stdin
     *            the additional input from the stdin
     * 
     * @return the message to be shown on the shell, null if there is no error
     *         from the command
     */
    @Override
    public String execute(final File workingDir, final String stdin) {
        setStatusCode(0);
        String output = "";

        final String newDirectory;

        if(this.args[0] == "-" && previousDirectory != null){
            newDirectory = previousDirectory;
        }
        else{
            newDirectory = this.args[0];
        }

        if( !newDirectory.equals(workingDir) &&
            changeDirectory(newDirectory) == null){
            setStatusCode(DIRECTORY_ERROR_CODE);
        output = DIRECTORY_ERROR_MSG;
    }
    else{
        previousDirectory = workingDir.getAbsolutePath();
        output = changeDirectory(newDirectory).getAbsolutePath();
    }

    return output;
}

}

P.S:请注意,这不是代码的完整实现,这不是cd的全部功能。

2 个答案:

答案 0 :(得分:2)

Real shell(至少Bash)shell在PWD环境变量和OLDPWD中的旧工作目录路径中存储当前工作目录路径。重写PWD不会改变您的工作目录,但重写OLDPWD确实会改变cd -将带您去的地方。

试试这个:

cd /tmp
echo "$OLDPWD"          # /home/palec
export OLDPWD='/home'
cd -                    # changes working directory to /home

我不知道你是如何实现shell功能的(即你如何表示当前的工作目录;通常它是由内核实现的进程的固有属性)但我认为你真的必须保持额外变量中的旧工作目录。

顺便说一句,shell也会为执行的每个命令分配(除了内部命令)。当前工作目录是进程的属性。当命令启动时,它可以更改其内部当前工作目录,但它不会影响shell的命令。只有cd命令(内部)可以更改shell的当前工作目录。

答案 1 :(得分:1)

如果要保留多个工作目录,只需创建一个LinkedList,在其中添加每个新的presentWorkingDirectory,并且如果要返回,请使用linkedList.popLast来获取最后一个workingDirectory。