linux-为什么指定我的shell会更改root的EUID?

如果在脚本中将我的shell指定为/ bin / bash,则root的EUID为0.如果我没有这样做,并且脚本在我的认shell(也为/ bin / bash)中运行,则root的EUID为空字符串!我是脚本的新手,并且认为只要bash进行表演就没有任何区别.

我正在运行的代码检查程序是否由root用户运行,如果没有,则以sudo重启程序.

#!/bin/bash
echo euid = $EUID
echo shell = $SHELL

if [ $EUID -ne 0 ]; then
    sudo "$0"
    exit $?
fi

跑步的时候我看到

euid = 1000
shell = /bin/bash
euid = 0
shell = /bin/bash

但是,如果我删除she-bang行,我会得到

euid = 1000
shell = /bin/bash
euid =
shell = /bin/bash
./test.sh: 4: [: -ne: unexpected operator

该脚本在同一shell中运行了四次,因此,为什么在sudo调用时未指定/ bin / bash时,它的行为有所不同?

如果重要的话,我正在运行Ubuntu 14.04.

提前致谢!

解决方法:

通过删除shebang行,您可以调用Ubuntu认shell,即Dash,而不是Bash.

破折号未定义$EUID,导致分配为空.实际上,$EUID是Bash在POSIX标准上带来的众多增强功能之一.取而代之的是,Dash旨在尽可能小,快速和轻巧,并且仅实现标准所要求的最少功能.

您断言它在同一外壳中全部运行了四次,但实际上并非如此.环境变量$SHELL不引用运行当前进程的外壳程序;它是指您的帐户的登录shell,在/ etc / passwd或等效文件中定义.

相关文章

用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2...
#!/bin/bashcommand1&command2&wait从Shell脚本并行...
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/ph...
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如...
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexa...
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全...