最近在培训linux,讲师让探究下su 和su -的区别,于是就有了本文。

本文的内容取材于互联网,经由本人理解,从新整理而成。

su  后面不加用户是默认切到 root
su  是不改变当前变量
su - 是改变为切换到用户的变量
也就是说su只能获得root的执行权限,不能获得环境变量

而su -是切换到root并获得root的环境变量及执行权限

语法:

$ su [user_name]
su  命令可以用来交互地更改你的用户ID和组ID。Su是switch user 或set user id的一个缩写。这个命令让你开启一个子进程,成为新的用户ID和赋予你存取与这个用户ID 关联所有文件的存取权限。因此,出于安全的考虑,你在实际转换身份时,会被要求输入这个用户帐号的密码。  
如果没有参数,su 命令将你转换为 root(系统管理员)。root 帐号有时也被称为超级用户,因为这个用户可以存取系统中的任何文件。也正是这个原因,许多人将su命令看成是 supper-user(超级用户)的一个缩写。当然,你必须要提供 root密码。  想要回到你原先的用户身份,不要再使用 su 命令,你只需要使用 exit命令退出你使用su命令而生成的新的对话进程。
$ su – username
一些配置文件是为你的对话线索而设立的。当你使用命令 su username时,你的对话特征和你原始的登录身份一样。如果你想要你的对话进程拥有转换后的用户 ID一致的特征,你要使用短斜杠: su – username。


另外,下面还有另一个博客上对su和su -的理解。

注意的是su的另外一个参数“-”,当指定该参数的时候,将会进入一个“login shell” ,即和该用户登录的情况完全一样。而不带参数“-”的时候进入的是一个“non-login shell”。那么问题就归结到“login shell”和“non-login shell“的区别上来了。

它们的差别在于,对于一个登录shell,bash在进入的时候会执行/etc/profile,~/.bash_profile,~/.bash_login, and ~/.profile中的内容,退出的时候会执行~/.bash_logout中的内容。而对于一个非登录shell,bash进入的时候会执行/etc/bash.bashrc,~/.bashrc中的内容。

通过一个例子来看一下,假如用户linuxer的 .bash_profile和.bashrc内容分别如下:

bash-3.2$ cat .bash_profile
# .bash_profile
export TEST=login-shell
bash-3.2$ cat .bashrc
# .bashrc
export TEST2=non-login-shell很简单,我们在文件里分别设置了两个环境变量,然后用su linuxer和su -linuxer分别进入后查看环境变量,结果如下

[leconte@localhost ~]$ su linuxer
口令:
bash-3.2$ env | grep TEST
TEST2=non-login-shell[leconte@localhost ~]$ su - linuxer
口令:
-bash-3.2$ env | grep TEST
TEST=login-shell可以看到,su linuxer进入非登录shell,.bashrc被执行;su – linuxer进入登录shell,.bash_profile被执行。