$ {PATH : + : $ {PATH}}의 의미는 무엇입니까?


24

최근에 cygwin 프로파일에서 다음을 더 정확하게 알았습니다.

/usr/local/bin:/usr/bin${PATH:+:${PATH}}

무슨 뜻이에요? 왜 단지 $ PATH가 아닌가? 이것이 '$ PATH가 존재하면 : $ PATH'를 추가합니까? 내 목적은 순서를 바꾸고 cygwin 경로를 Windows 경로 뒤에 넣는 것입니다. 과거에는

$PATH:/usr/local/bin:/usr/bin

그러나 이것은 나를 혼란스럽게합니다. 어쩌면 내가해야 할 것

PATH="${PATH:+${PATH}:}/usr/local/bin:/usr/bin"

$ PATH 끝에 :를 추가하려면?


1
귀하의 질문 제목은 SE Hot Questions 사이드 바 i.imgur.com/g6pPmzf.png
Brad

답변:


38

:+의 형태 파라미터 확장 :

$ {parameter : + [word]} : 대체 값을 사용하십시오.

매개 변수가 설정되지 않거나 null이면 null이 대체됩니다. 그렇지 않으면 단어의 확장 (또는 단어가 생략 된 경우 빈 문자열)이 대체됩니다.

즉, 변수 $var가 정의 echo ${var:+foo}되면 인쇄 foo하고 그렇지 않은 경우 빈 문자열을 인쇄합니다.

두 번째 :는 특별한 것이 아닙니다. 의 디렉토리 목록에서 구분 기호로 사용되는 문자입니다 $PATH. 따라서 PATH="/usr/local/bin:/usr/bin${PATH:+:${PATH}}"짧은 글쓰기 방법입니다.

if [ -z "$PATH" ]; then
    PATH=/usr/local/bin:/usr/bin
else
    PATH=/usr/local/bin:/usr/bin:$PATH
fi

설정되지 않은 :경우 추가를 피하는 것이 현명한 방법입니다 $PATH. 예를 들면 다음과 같습니다.

$ PATH="/usr/bin"
$ PATH="/new/dir:$PATH" ## Add a directory
$ echo "$PATH"
/new/dir:/usr/bin

그러나 PATH설정되지 않은 경우 :

$ unset PATH
$ PATH="/new/dir:$PATH"
$ echo "$PATH"
/new/dir:

A :자체는 현재 디렉토리를에 추가합니다 $PATH. 사용 PATH="/new/dir${PATH:+:$PATH}"하면 이것을 피할 수 있습니다. 따라서 PATH="${PATH:+${PATH}:}/usr/local/bin:/usr/bin"원하는 경우 사용 하거나 원하는 PATH="$PATH:/usr/local/bin:/usr/bin"경우 사용할 수 있습니다 . 유일한 차이점은 전자가 추가 :를 추가하여 현재 디렉토리를에 추가 할 수 있다는 것 $PATH입니다.


엑스트라 :해로운가요?
고양이

4
@tac은 실제로 현재 디렉토리를 사용자에 추가합니다 $PATH(@AndyB의 답변 참조 ). 공격자가 현재 디렉토리에 파괴적인 스크립트를 업로드하고 그 이름을 지정하는 등의 상황에서는 보안 상 위험 할 수 ls있지만 대부분의 경우 마음에 들지 않습니다. 실제로 일부 시스템 PATH은 기본적으로 현재 디렉토리를 기본 디렉토리에 추가 합니다.
terdon

경로는 것입니다 하나 개 내가 그들에게 길 원합니다 장소 csh배열로 다음을 핸들.
hometoast

8

맞습니다. '$ PATH가 있고 null이 아닌 경우'를 추가 한 후 : $ PATH를 추가하십시오.

$ PATH가 정의되지 않은 경우 선행 (또는 후행) 콜론을 추가하지 않기 때문에 $ PATH가 있는지 확인해야합니다. :/usr/local/bin:/usr/bin또는 /usr/local/bin:/usr/bin:, 또는 에서 와 같이 경로에서 길이가 0 인 (널) 디렉토리 이름 은 현재 디렉토리를 검색/usr/local/bin::/usr/bin 함을 의미 합니다 .

에서 발췌 man bash:

   PATH   ...
          A zero-length (null) directory name in the value of PATH indicates 
          the current directory.  A  null  directory name may appear as two 
          adjacent colons, or as an initial or trailing colon.
          ...

아마 당신이하고 싶은 일이 아닙니다.

다음 두 줄은 같은 일을합니다.

PATH=":/bin"        # search current directory, then /bin
PATH=".:/bin"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.