笔记

笔记
#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 ]

仍然是[of zsh,就像 of 一样ksh也支持==作为 的替代选项=,但除非您禁用该equals选项(就像在ksh模拟中一样),否则您需要至少引用第一个=以避免该=cmd运算符:

[ "$USER" '==' root ]

请注意, while$USERNAME是由 自动设置的zsh$USER但不是(尽管它被诸如 之类的东西设置为环境变量login)。

要测试您是否具有超级用户权限,检查您的有效用户 ID 是否为 0 更为可靠,这可以在zshbash中使用[ "$EUID" -eq 0 ]或完成(( EUID == 0 ))

也可以看看:

答案2

这行代码在语法上并不正确(但bash可以处理它):

if [ $USER == 'root' ]

您应该==仅与[[...一起使用]]=否则。$USER如果您继续使用[...]语法,我还建议您使用双引号

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

或者

if [ "$USER" = 'root' ]

相关内容