bash“if sudo true; then”中“true”的目的是什么

bash“if sudo true; then”中“true”的目的是什么

我已经编写了这个 bash 脚本,它测试用户是否具有超级用户权限,如果没有,它会要求它们。最终我试图反转第二个“if”语句,以便我可以删除以下两行(echo“password ok”和下一行的 else )

# Root user only
if [[ "$EUID" != 0 ]]; then
    sudo -k # make sure to ask for password on next sudo
    if sudo true; then
        echo "Password ok"
    else
        echo "Aborting script"
        exit 1
    fi
fi

echo "do my ops"

第四行“true”的目的只是一个空语句吗?

我需要反转第四行的测试,该怎么做?这是我尝试过的:

if sudo false; then  
if sudo true == false; then
if [!(sudo true)]; then

答案1

true在 bash 中不是关键字,它是一个立即退出并带有成功退出代码的程序。同样,false是一个以不成功的退出代码退出的程序。

您可以通过从终端运行这两个程序来尝试此操作,然后读取变量$?,其中包含最后一个程序的退出代码;

true
echo $? # 0
false
echo $? #1

if sudo true不等于if sudo == true.正在使用if sudo true运行程序,并检查退出代码。truesudo

所以:

if sudo false; then正在以 sudo 身份运行程序false。返回值始终为 false。

if sudo true == falsetrue将使用参数运行程序==false使用sudo.这显然不是你想要的。

if [!(sudo true)]是无效语法。

您可能正在寻找的是

if ! sudo true;

答案2

我觉得接受的答案实际上并没有回答你的问题?

目的这样做是为了检查你是否真的可以sudo

如何此检查是通过true程序执行的,如接受的答案中所述。

答案3

正如我在这个脚本中看到的。它只是检查 sudo 是否启用,仅此而已。

true 只是返回 true。

因此,在这种情况下,如果他们需要使用 sudo 运行任何命令,它会首先在启动时进行检查,仅询问密码一次。

条件的工作原理如下:如果 sudo 正确执行 true 命令,则 if 条件返回 true,则 sudo 已启用并且用户输入的密码正确,否则您输入的密码错误或 sudo 未启用,脚本不得继续。

其他命令不需要询问 sudo 密码,因为您的身份验证在第一次就成功了(但这取决于 sudo 配置,因此此脚本很大程度上取决于环境配置)

“echo password ok”也证明了这一点。 shell 脚本将不再询问密码。

相关内容