4

如果我在脚本中将我的 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。

提前致谢!

4

1 回答 1

6

通过删除 shebang 行,您调用的是 Ubuntu 默认 shell,即 Dash,而不是 Bash。

破折号没有定义$EUID,导致空分配。事实上,$EUID这是 Bash 对 POSIX 标准带来的众多增强之一。相反,Dash 旨在尽可能小、快和轻量级,并且只实现标准所需的最少功能集。

你断言它在同一个 shell 中运行了四次,但实际上它没有。环境变量$SHELL不是指运行当前进程的shell;它指的是您帐户的登录 shell,在中定义/etc/passwd或等效。

于 2014-06-18T21:13:02.623 回答