pushd popd全局目录堆栈?

时间:2012-03-28 22:26:42

标签: shell

我不知道是否有一种有效的方法可以做到这一点。但是,一直想看看它是否可能。

我知道pushd,popd和dirs对于你最近访问过的目录之间的复制很有用。

但是,有没有一种方法可以保持全局堆栈?因此,如果我在一个终端中推送一些东西(使用pushd),它会反映在另一个终端中(可能只是该登录会话中的终端)。

2 个答案:

答案 0 :(得分:4)

您应该可以使用一对shell函数和一个临时文件来执行此操作。

您的临时文件的名称将类似于“/home/me/.directory_stack”,并且只包含目录列表:

/home/me
/etc
/var/log

您的'push_directory'功能只会将当前目录添加到列表中。 'pop_directory'函数将拉出最近的列表并切换到该目录。将堆栈存储在这样的文件中可确保所有打开的终端(甚至重启)之间存在信息。

以下是一些示例函数(警告:仅经过轻微测试)

directory_stack=/home/me/.directory_stack
function push_dir() {
    echo $(pwd) >> $directory_stack
    cd $1
}
function pop_dir() {
    [ ! -s $directory_stack ] && return
    newdir=$(sed -n '$p' $directory_stack)
    sed -i -e '$d' $directory_stack
    cd $newdir
}

将其添加到.bashrc,每次登录shell时都会自动定义它们。

答案 1 :(得分:3)

您可能希望编写一些shell函数并使用它们代替pushdpopd。像以下(未经测试的)函数可能会起作用:

mypushd() { echo "$1" >> ~/.dir_stack ; cd "$1" }
mypopd() { dir=`tail -1 ~/.dir_stack` ; cd "$dir" ;
           foo=`wc -l ~/.dir_stack | egrep -o '[0-9]+'` ;
           ((foo=$foo-1)) ;
           mv ~/.dir_stack ~/.dir_stack_old ;
           head -n $foo ~/.dir_stack_old > ~/.dir_stack }

如果你编写一个返回并删除文件最后一行的小程序,你可以摆脱一些丑陋的位。