여러 줄 구문을 사용하여 PATH에 경로 추가


16

내가 이해하는 한 PATH환경 변수에 경로를 추가하는 일반적인 방법 은 :문자로 구분 된 경로를 연결하는 것입니다.

예를 들어, 나는 그것을 세 가지 경로를 추가 할 경우 /my/path/1, /my/path/2그리고 /my/path/3나는 그것이 같은 다음과해야 할 것이다 :

PATH=$PATH:/my/path/1:/my/path/2:/my/path/3

읽기 쉽지 않습니다.

여러 줄 구문을 사용 하여 변수 경로 를 정의 하거나 추가 하는 방법이 있습니까? 아마도 배열을 사용합니까? 나는 이와 같은 것을 찾고있다 :PATH

PATH = 
$PATH
/my/path/1
/my/path/2
/my/path/3

쉘 고유의 흥미로운 솔루션이있는 경우 zsh에서 솔루션을 찾고 있습니다.

답변:


12

zsh에서 작동하는지 모르겠지만 bash에서는 작동합니다.

PATH=$(paste -d ":" -s << EOF 
$PATH
/my/path/1
/my/path/2
/my/path/3
EOF
)

편집 하고 더 짧게 :

PATH=`paste -d ":" -s << EOF 
$PATH
/my/path/1
/my/path/2
/my/path/3
EOF`

그리고 프로세스를 생성하지 않고 :

new_path=(
"$PATH"
/my/path/1
/my/path/2
/my/path/3)
OLD_IFS="$IFS"
export IFS=":"
PATH="${new_path[*]}"
export IFS="$OLD_IFS"

큰 따옴표는 중요한 arround를 $PATH, $IFS, ${new_path[*]}$OLD_IFSIFS의 변수와 피할 쉘 해석에 공백을 유지합니다.

sed를 사용하여 주석과 빈 줄 관리 기능이있는 Update2 :

PATH=`sed -e '/^#/'d -e '/^$/'d << EOF | paste -d ":" -s 
$PATH
/my/path/1
# This is a comment.
/my/path/2

/my/path/3
EOF`

주석 문자는 줄의 첫 번째 문자 여야하며 빈 줄은 완전히 비워야합니다. 주석 이전과 빈 줄에 공백과 탭을 관리하려면 sed -e '/^[ \t]*#/'d -e '/^[ \t]*$/'d대신 사용 하십시오 (sed 구현과 관련이있을 수 있으므로 테스트 할 탭).


zsh에서 마지막 스 니펫을 테스트했으며 작동합니다. 또한 다른 솔루션보다 약간 깨끗합니다 (한 줄에 한 경로). 솔루션이 주석 처리 된 행 (경로)을 수용 할 수 있습니까? 빈 줄은 어떻습니까?
Amelio Vazquez-Reina

주석과 빈 줄 관리로 업데이트하십시오.
jfg956

그리고 sed를 사용하면 더 복잡한 스크립트로 붙여 넣기 프로세스를 피할 수 있습니다.
jfg956

paste솔루션 의 경로에 들여 쓰기를 사용해도 괜찮 습니까?
void.pointer

20

전혀 흥미로운 해결책은 아니지만 휴대 성이 매우 뛰어납니다.

PATH=${PATH}:/my/path/1
PATH=${PATH}:/my/path/2
PATH=${PATH}:/my/path/3

1
이것은 지난 몇 년 동안 내가 본 것의 전형적인 것입니다. 경로를 쉽게 재정렬하거나 요소를 PATH = / my / path / 1 : $ {PATH}로 변경하여 앞에 붙일 수 있습니다.
bsd

1
+=문자열을 완전히 다시 작성하지 않아도되도록 사용할 수도 있습니다 .
Chris Down

그리고 중괄호를 사용할 필요조차 없습니다. 환경 변수 이름에는 콜론을 사용할 수 없으므로 해결할 모호함이 없습니다.
Alexios

흥미롭지 않아 +1. 때로는 흥미로울 수 있지만 이것은 그중 하나가 아닙니다! (특히 OP가 명시 적으로 "읽기 쉽지 않음"을 문제로 언급 한 이후)
ruakh

@ChrisDown 문자열을 다시 작성하지 않고 앞에 오는 구문이 있습니까?
John P

12

zsh에서는 $path배열입니다.

path=(
    $path
    ~/.local/bin
    ~/.gem/ruby/2.0.0/bin
)

참고 : 둘 다 path소문자입니다.


셸에 따라 다르지만 모두 처리하지는 않습니다.
vonbrand

1
@vonbrand : 예. 그러나 zsh에서는 작동합니다. 언급 할 가치가 있다고 생각합니다.
Kabie

3
+1 (이 질문은 zsh 태그로 설정 됨 )
Johnsyweb

영업 이익은 특별히 zsh을에 대해 질문 때문에, 이것은 최선의 선택입니다
다니엘 Serodio

1
$ path와 $ PATH의 구별에 대해 더 배우고 싶은 사람은 이 글을
mbigras

7

zsh에서 경로 끝에 디렉토리를 추가하는 경우 :

path+=/my/path/1
path+=/my/path/2
path+=(/path/to/app/{i386,share}/bin)

이식 가능 : PATH에 경로를 올바르게 추가하는 방법?

glob 한정자 를 사용 하여 기존 디렉토리가 아닌 항목이나 해당 항목에 대한 심볼릭 링크를 제외 할 수 있습니다 . 나중에 세션 중에 디렉토리를 추가 할 수 있을지에 따라 (예 : 원격 파일 시스템에있는 경우), 바람직하지 않을 수 있습니다. path+=/my/path오른쪽이 문자열 컨텍스트에 있으므로 글 로빙을 수행하지 않기 때문에 구문 을 사용하여이를 수행 할 수 없습니다 . path+=(/my/path)각 배열 요소가 목록 컨텍스트에서 확장되므로 이를 수행 할 수 있습니다 .

path+=(/path/to/app/{i386,share}/bin(-/N))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.