그렇지 않기 때문에 의아해합니다 echo "PATH=$PATH:/usr/local/sbin"
(그것이 와 관련이 있다고 생각했습니다 :
).
또한 Bash에서는 두 명령 모두 예상대로 작동합니다.
$ echo "PATH=$PATH"
PATH=/usr/local/bin
$ echo "PATH=$PATH:/usr/local/sbin"
PATH=/usr/local/bin:/usr/local/sbin
$ echo "$USER:staff"
zsh: bad substitution
답변1
:s
after는 다음 $USER
과 같이 해석되기 때문에확장 수정자. 다음을 수행하면 이를 명확하게 확인할 수 있습니다.
% autoload -Uz compinit; compinit # Init completion system
% zstyle ':completion:*' group-name '' # Enable completion grouping
% zstyle ':completion:*' format '%d' # Add titles to the groups
% print $USER: # and press Tab or ^D right after the `:`
modifier
& -- repeat substitution
A -- as ':a', then resolve symlinks
P -- realpath, resolve '..' physically
Q -- strip quotes
a -- absolute path, resolve '..' lexically
c -- PATH search for command
e -- leave only extension
g -- globally apply s or &
h -- head - strip trailing path element
l -- lower case all words
q -- quote to escape further substitutions
r -- root - strip suffix
s -- substitute string
t -- tail - strip directories
u -- upper case all words
그리고 위 목록에서 볼 수 있듯이 :/
확장 수정자가 아닙니다.
${PATH}
그러면 항상 , 등을 사용하는 것이 좋습니다${USER}
.
아니요, 보통은 그냥 사용해도 괜찮지만 $USER
,때때로,보시다시피 를 사용해야 합니다 ${USER}
. :)
그러나 귀하의 질문에 있는 코드와 관련하여 Zsh에서 사용할 수 있는 두 가지 다른 권장 사항을 알려드릴 수 있습니다.
- 사용
$path
대신에$PATH
그리고 - 사용
print
대신에echo
.
% print $PATH
/usr/local/bin
% print $path
/usr/local/bin
% path+=/usr/local/sbin # $path is an array, not a string
% print $PATH # $path and $PATH are "tied" & automatically in sync
/usr/local/bin:/usr/local/sbin
% print -c $path # Print the items in columns, like `ls`
/usr/local/bin /usr/local/sbin
% print -l $path # Print one item per line, like `ls -l`
/usr/local/bin
/usr/local/sbin
% path+=/usr/local/sbin
% print -c $path
/usr/local/bin /usr/local/sbin /usr/local/sbin
% typeset -U PATH path # Make each item unique/Eliminate duplicates
% print -c $path
/usr/local/bin /usr/local/sbin