zsh 中的路径变量未正确设置

zsh 中的路径变量未正确设置

由于某种原因,我的 $PATH 变量没有正确设置,这意味着我无法运行很多我想要的命令。以下是我的.zshrc文件中的相关行:

if [[ -f ~/.profile]]; then
    source ~/.profile
fi

这是我的.profile文件:

pathdirs=( 
    ~/.rvm/bin
    /usr/local/heroku/bin
    /usr/local/shar/scala-2.10.0/bin
)

for dir in $pathdirs; do
    if [[ -d $dir ]]; then
        path+=$dir
    fi
done

当我回显 $PATH 变量时,这三个项目都没有显示。当我跑步时我得到的cat $PATH只是/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/X11/bin:/usr/local/git/bin: /usr/texbin。有人能看看我是否做错了什么吗?

答案1

这是我为另一个答案编写的函数:

_path_assign() { oFS=$IFS ; IFS=: ; add=$* ; unset P A ; A=
    set -- ${PATH:=$1} ; for p in $add ; do {
        [ -z "${p%-[AP]}" ] && { unset P A
                eval ${p#-}= ; continue ; }
        for d ; do [ -z "${d%"$p"}" ] && break
        done ; } || set -- ${P+$p} $* ${A+$p}
        done ; export PATH="$*" ; IFS=$oFS
}

% PATH=/usr/bin:/usr/yes/bin
% _path_assign \
    /usr/bin \
    /usr/yes/bin \
    /usr/bin/nope \
    -P \
    /usr/nope/bin \
    /usr/bin \
    -A \
    /nope/usr/bin \
    /usr/nope/bin

% echo $PATH

输出:

/usr/nope/bin:/usr/bin:/usr/yes/bin:/usr/bin/nope:/nope/usr/bin

如果尚未包含a 后面的所有参数,-P则将它们添加到前面;如果 a 后面的所有参数$PATH尚未包含在内,则它们相同,-A但它们是附加的。如果您想首先验证它们是实际目录,您可以更改:

|| set -- ${P+$p} $* ${A+$p}
done

到:

|| { [ -d "$p" ] && set -- ${P+$p} $* ${A+$p}
} ; done

您可能应该通过添加以下内容来确保zsh处理更便携:$IFS

[ "${SHELL##*/}" = "zsh" ] && emulate sh

到第一行。

进行这两项更改,您问题中的所有代码都可以替换为此函数,并且:

test -f ~/.profile && . $_
_path_assign ~/.rvm/bin \
    /usr/local/heroku/bin \
    /usr/local/shar/scala-2.10.0/bin

相关内容