노트

노트
#Get client IP base on current logged in user
if [ $USER == 'root' ]
then
    ip="$(last | awk 'NR==1 {print $3}')"
else
    ip="$(echo $SSH_CONNECTION | cut -d " " -f 1)"
fi

/root/.bashrc:157:= 찾을 수 없음

157호선

여기에 이미지 설명을 입력하세요.


노트

나는 이 줄 source ~/.bashrc.zshrc

vi .zshrc
source ~/.bashrc  # import all my quick aliases and fns

답변1

존재하다 zsh,=cmd명령의 경로로 확장되는 파일 이름 확장 연산자입니다 cmd. =cmd비슷하다 $commands[cmd].

따라서 여기서는 명령 ==의 매개변수 중 하나를 사용하여 [명령의 경로로 확장합니다 =. =귀하의 명령에서 호출된 명령이 없으므로 오류 $PATH가 발생합니다.

비교하다:

$ echo =ls
/bin/ls
$ echo =junk
zsh: junk not found

명령의 항등 연산자 [는 입니다 =. 이 명령은 테스트만 수행하고 할당은 수행하지 않으므로 일부 다른 언어(예: C의 vs 또는 다른 언어의 vs 등) [에서와 같이 할당 연산자와 동등 비교 연산자를 구분할 필요가 없습니다 .===:==

따라서 다음과 같아야 합니다.

[ "$USER" = root ]

Still [of zsh, like of 도 as 에 대한 대안을 ksh지원 하지만 해당 옵션을 비활성화하지 않는 한(시뮬레이션에서와 같이 ) 해당 연산자를 피하기 위해 최소한 첫 번째 옵션을 인용해야 합니다 .===equalsksh==cmd

[ "$USER" '==' root ]

while은 에 $USERNAME의해 자동으로 설정되지만 zsh그렇지 $USER는 않습니다(비록 에 의해 환경 변수로 설정되지만 login).

슈퍼유저 권한이 있는지 테스트하려면 유효 사용자 ID가 0인지 확인하는 것이 더 안정적입니다. 이는 zsh또는 를 bash사용하여 [ "$EUID" -eq 0 ]수행 할 수 있습니다 (( EUID == 0 )).

또한보십시오:

답변2

다음 코드 줄은 구문상 정확하지 않지만 bash작동합니다.

if [ $USER == 'root' ]

오직... 그렇지 않은 경우 ==에만 [[사용해야 합니다 ]]. ... 구문을 계속 사용한다면 큰따옴표도 사용하는 것이 좋습니다.=$USER[]

if [[ "$USER" == 'root' ]]

또는

if [ "$USER" = 'root' ]

관련 정보