讨论说明Linux中"su"和"su -"的区别

184 阅读2分钟

之间的区别是 诉讼和连字符的 su - 命令的区别在于 su命令不带参数,几乎保留了属于原用户的所有环境变量。与此相反,连字符的su-命令清除了大部分环境变量。

我们不是在讨论两个不同的命令,而是在讨论一个没有特定标志的命令(连字符是标志)和带有标志的同一命令。

输入su -和输入su -l是一样的;这两个命令都会清除大部分的环境变量。因此,在继续阅读本文之前,让我们看看什么是环境变量。

Linux中的环境变量。

环境变量是用来定义shell进程及其子进程正在执行的环境特征的值,例如,进程使用环境变量$SHELL来了解正在使用的shell(BashZsh等)。

系统有许多变量,本文将重点讨论那些在我们使用 su命令时受影响的变量。

要查看系统中的所有变量,可以运行 出口命令,如下图所示。

export

正如你在上面的截图中所看到的,我们的系统中有许多变量。我们将重点关注HOMESHELLUSERLOGNAMEPATH这几个具体变量。

我们将看到的第一个变量是PATH。这个环境变量的值对于系统知道在哪里找到要执行的命令或程序非常有用。系统默认的环境变量PATH是在*/etc/profile* 文件中定义的。用户的PATH变量位于他们的主目录中的~/.profile

要了解你的PATH环境变量值,你可以使用 echo命令,后面加上 ***$*符号和你想检查的环境变量,这里是指PATH,如下面的例子所示。

echo $PATH

正如你所看到的,系统会返回已定义的环境变量,以便我们的系统知道在哪里搜索并找到我们要执行的命令。

本文解释的第二个环境变量是SHELL变量。这个变量的值告诉系统我们正在使用什么shell,如果是Bash、Zsh、Ksh等。

要查看SHELL环境变量的值,请重复前面解释的步骤,将PATH替换为PATH替换为SHELL,如下图所示。

echo $SHELL

正如你所看到的,这个shell是Bash。这就是我们的系统如何知道我们正在使用的shell,其数值如上所示。

Linux中另一个重要的环境变量是*$HOME*。这个值表示用户的主目录是什么。要了解这个值,你可以运行下面的命令。

echo $HOME

环境变量$LOGNAME的值是你登录的用户。

echo $LOGNAME

环境变量USER的值是用户的ID,它与USER的值是用户的ID,它与LOGNAME相同。

echo $USER

上面解释的环境变量是指那些被 su命令影响的环境变量,当添加了连字符或 -l标志时,上面解释的环境变量是受命令影响的。

"su "和 "su - "命令的区别

不加标志的 su命令不带标志和 su 加了连字符或 -l的命令的区别是,不带标志的命令保留你的环境变量,只改变用户。

当使用带连字符或 -l标志时,大多数环境变量都被清除了。

下一个例子显示了linuxhint的用户切换到root,使用 su的方式将用户切换为根用户。

然后,在检查了$LOGNAME环境变量后,我们看到它仍然是linuxhint而不是root。

su

echo $LOGNAME

与前面的例子相反,如果实施了连字符,在检查$LOGNAME变量时,它将被更新为root。

su -

echo $LOGNAME

让我们对$USER环境变量做同样的尝试。

su

echo $USER

正如你所看到的,当以linuxhint身份进行su操作以改变为root身份并检查$USER变量时,仍为linuxhint

与前面的例子相反,如果执行连字符,$USER变量将被清除并更新,如下所示。

su -

echo $USER

在本教程的最后,这个例子显示了 -l 标志与连字符的作用完全相同。

su -l

echo $LOGNAME

echo $USER

结论

环境变量是任何Linux用户必须知道的一个基本概念。一旦你理解了它们的功能,你就可以很容易地认识到 su命令中没有和有 -l标志(这与连字符的 su).

我希望这篇文章能说明"su"和"su -"的区别是有帮助的。