zsh에서 $path와 $PATH(소문자와 대문자)의 차이점은 무엇입니까?

zsh에서 $path와 $PATH(소문자와 대문자)의 차이점은 무엇입니까?

존재하다FreeBSD12. 사용zsh쉘 에서 $path(소문자)와 (대문자)를 볼 $PATH때 이러한 차이점을 발견했습니다 .

echo $path

/sbin /bin /usr/sbin /usr/bin /usr/local/sbin /usr/local/bin /usr/home/freebsd/bin

echo $PATH

/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/home/freebsd/bin

한 출력은 공백 문자로 구분되고 다른 출력은 콜론 문자로 구분됩니다.

➥ 왜 이렇게 차이가 나는 걸까요?

이 두 개의 서로 다른 독립변수인가요? 아니면 소문자/대문자가 내가 모르는 어떤 트릭이나 의미를 유발합니까?

이것이 zsh특징인가요? 아니면 FreeBSD의 기능인가요?

답변1

이것은 특징입니다zsh다음에서 상속됨csh/tcsh.

이것$path 대량으로변수는묶음도착하다$PATH 스칼라(문자열) 변수. 하나에 대한 수정 사항은 다른 수정 사항에도 반영됩니다.

zsh(with )와 달리 (t)csh다른 변수를 다음 $PATH과 결합할 수 있습니다.typeset -T. 필수는 아니지만 관례에 따라 콜론으로 구분된 스칼라에는 대문자 이름을 사용하고 배열에는 동일한 소문자 이름을 사용합니다. 콜론이 기본 구분 기호이지만 다른 구분 기호를 사용할 수도 있습니다(예: 여러 줄 문자열을 배열에 바인딩하는 줄 바꿈 또는 csv 행을 배열에 바인딩하는 쉼표)

최신 버전에서는 zsh또는 두 변수 사이 typeset -p PATHtypeset -p path링크를 표시합니다.

% typeset -p path
typeset -aT PATH path=( /home/chazelas/bin /usr/local/bin /usr/bin /bin )

이는 구성 요소를 더 쉽게 추가, 제거하거나 반복할 수 있게 해주기 때문에 유용합니다.

하나를 만들어 typeset -U path요소를 만드세요.고유한또한 $PATH변수를 깨끗하게 유지하는 데 도움이 됩니다( tcsh를 사용하여 비슷한 결과를 얻을 수 있습니다 set -f).

완전성을 위해 배열로 처리할 수 있는 두 개의 다른 쉘이 있지만 fish, 해당 경우에는 별도의 소문자 변수를 통하지 않습니다.yash$PATH

존재하다 fish,이름이 콜론으로 끝나는 변수는 PATH암시적으로 분할/연결된 목록으로 처리됩니다., 그래서 set PATH /foo /bar와 는 set PATH /foo:/bar거기에서 동일합니다.

에서 yash배열을 환경으로 내보내면 콜론으로 연결된 요소가 포함된 환경 변수의 값이 생성됩니다. 그러니 PATH=(/foo /bar)거기서 하면 됩니다. 이는 $PATH시작 시 환경에서 가져올 때 yash자동으로 배열로 생성되지 않습니다 .

관련 정보