$pwd를 $PATH 변수에 조건부로 할당

$pwd를 $PATH 변수에 조건부로 할당

bin디렉토리가 존재하는 경우 현재 작업 디렉토리와 해당 프로젝트별 디렉토리를 $PATH에 추가하고 싶습니다.

그래서 나는 다음 줄을 내.zshrc:

[ -d "$(pwd)/vendor/bin" ] && export PATH="$(pwd)/vendor/bin":"$PATH"
[ -d "$(pwd)/node_modules/.bin" ] && export PATH="$(pwd)/node_modules/.bin":"$PATH"

명령을 터미널에 수동으로 붙여넣으면 위의 경로가 앞에 추가되지만 그렇지 않으면 그렇지 않습니다. 이전 과 동일합니다 $PATH. 또한 "${PATH}"zsh path함수 등 다양한 작성 방법도 시도했습니다 . 둘 다 수동으로 붙여넣으면 작동하지만 내부에서는 작동하지 않습니다..zshrc문서.

--

온라인 중macOS 하이 시에라 v10.13.6그리고기본 터미널그리고 사용zsh v5.7.1.

답변1

구체적으로 zsh다음과 같이 할 수 있습니다.

path[1,0]=( ~/projects/{vendor/,node_modules/.}bin(/N) )

어디:

path[1,0]=( list )

list배열의 시작 부분에 를 삽입합니다 ( $pathin 은 in 과 같은 배열입니다 zsh).$PATHcsh

glob이 활성화되고 디렉토리 유형의 파일을 선택하는 (N/)glob 한정자입니다 . 따라서 해당 두 파일이 존재하고 유형 인 경우 앞에 추가합니다.Nnullglob/$PATH목차.

pwdpw은 현재 orking d디렉토리(변수의 내용)를 인쇄하는 명령으로 , 를 사용 하거나 디렉토리를 시작 위치에 조건부로 추가 하려는 경우 $PWD에만 의미가 있습니다 . 그러나 이것도 위험할 수 있습니다. 예를 들어 다른 사람의 디렉터리 에서 시작하면 누군가가 또는 같은 표준 명령을 무시하는 악성 파일을 거기에 심을 수 있습니다 .$(pwd)$PWD.zshrc$PATHzshzsh/tmplsrm

답변2

.rc를 사용하지 않고 원하는 방식으로 수행하는 것은 불가능하다고 생각합니다(.rc는 한 번만 실행되며 특별히 수행하지 않는 한 나중에 실행되지 않습니다). 하지만 별칭이 두 개라면 어떻게 될까요?

backupPATH=$PATH
function mkpath {
    [ -d "$(pwd)/vendor/bin" ] && export PATH="$(pwd)/vendor/bin":"$PATH"
    [ -d "$(pwd)/node_modules/.bin" ] && export PATH="$(pwd)/node_modules/.bin":"$PATH"
}
alias resetpath="PATH=$backupPATH"

이렇게 하면 언제든지 현재 디렉터리를 $PATH에 추가할 수 있습니다.

답변3

다른 사람들이 지적했듯이 현재 작업 디렉터리가 프로젝트가 포함된 디렉터리가 아닐 수 있고 코드가 다음과 같기 때문에 새 터미널을 열 때 코드가 예상대로 작동하지 않을 수도 있습니다.오직새 쉘이 시작될 때 실행됩니다.

$HOME대신, 아마도 디렉토리와 관련하여 프로젝트가 어디에 있는지 대략적으로 알 수 있습니다. 그렇다면 다음을 사용할 수 있습니다.

for binpath in vendor/bin node_modules/.bin; do
    if [ -d "$HOME/projects/$binpath" ]; then
        PATH=$HOME/projects/$binpath:$PATH
    fi
done

export PATH

$HOME/projects여기가 귀하의 프로젝트가 있는 곳이라고 가정합니다 .

마지막 항목은 이미 내보냈을 수 있으므로 export필요하지 않을 수 있습니다 .PATH

관련 정보