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

관련 정보