${PATH:+:${PATH}}은(는) 무슨 뜻인가요?

${PATH:+:${PATH}}은(는) 무슨 뜻인가요?

나는 최근 내 cygwin 프로필에서 더 정확하게 다음과 같은 내용을 발견했습니다.

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

무슨 뜻이에요? 왜 $PATH만 사용하면 안 되나요? "$PATH가 존재하는 경우 추가:$PATH"입니까? 내 의도는 순서를 바꾸고 Windows 경로 뒤에 cygwin 경로를 넣는 것입니다. 예전엔 그랬겠지

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

그러나 이것이 나를 혼란스럽게 한다. 아마도 내가 해야 할 것 같아

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

$PATH 끝에 다음을 추가합니다: ?

답변1

이건 :+형태야매개변수 확장:

${매개변수:+[단어]}: 대체 값을 사용합니다.

인수가 설정되지 않았거나 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.

답변2

당신 말이 맞습니다. "$PATH가 존재하고 비어 있지 않으면 다음을 추가하십시오:$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"

답변3

비교도 유용해요선택하다그리고기본매개변수 확장.

:-그것을 사용 ${}하면기본다음과 같은 값:

${a:-xxx} returns "xxx" if a is not defined.

:+내부를 사용 ${}하면선택하다다음과 같은 값:

${a:+xxx} returns "xxx" if a is defined.

따라서 이 경우 기본적으로 정의된 값을 사용하는 것이 아니라 대체 값이 반환된다는 ${PATH:+${PATH}:}의미 입니다 .PATHPATHPATH:

관련 정보