goto的bash版本

上文,bash下的dirs参数用法与zsh下稍微有点不同,下面是bash版本的goto实现,就dirs函数略有不同:

pushd() {
    if [ $# -eq 0 ]; then
        DIR="${HOME}"
    else
        DIR="$1"
    fi

    builtin pushd "${DIR}" > /dev/null
}

alias cd='pushd'

dirs() {
    tmphash="/tmp/.dirs"

    builtin dirs -p | awk '{
        if (a[$1]=="") a[$1]=NR;
        if (length(a)==10) exit
    }END{for(i in a) print a[i],i}' |
    sort -nk1 | cut -d' ' -f2- > $tmphash

    nl $tmphash
}

goto() {
    tmphash="/tmp/.dirs"
    if [ ! -f $tmphash ]; then
        echo "no record"
        return 1
    fi
    if [ $# -eq 0 ]; then
        return 1
    fi

    dest=`awk -v n=$1 'NR==n&&1' $tmphash`

    if [[ $dest == "~" ]]; then
        dest=${HOME}
    elif [[ $dest == "~/"* ]]; then
        dest="${HOME}/${dest:2}"
    elif [[ $dest == "~"* ]]; then
        dest=`eval "echo $dest"`
    fi

    pushd $dest
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注