参考文章:(总结)Linux下su与su -命令的本质区别

  我一直是习惯使用su username来切换用户的,而且并不知道su和su -有什么区别,一直以为是没啥区别的,但是在一个测试中,在测试的同事的指导下,他说你su - ××× 之后×××,那一刻突然福至心灵觉得可能二者是有区别的,然后执行了su - 用户 之后,果然得到了su 用户的时候得不到的结果。。。。。然后还发现,以前执行db2的命令要cd /opt/IBM/db2/V9.7.5/,然后bin/db2 ×××真的有够麻烦的,但是su -之后,直接db2就可以执行命令了,所以有必要来分析一下这两个命令到底有什么区别。

su命令和su -命令最大的本质区别就是:
- 前者只是切换了root身份,但Shell环境仍然是普通用户的Shell
- 而后者连用户和Shell环境一起切换成root身份了。只有切换了Shell环境才不会出现PATH环境变量错误
- su切换成root用户以后,pwd一下,发现工作目录仍然是普通用户的工作目录;而用su -命令切换以后,工作目录变成root的工作目录了。用echo $PATH命令看一下su和su -以后的环境变量有何不同。以此类推,要从当前用户切换到其它用户也一样,应该使用su -命令。

  • 在LINUX和AIX系统上还是有一些区别,AIX上一定要su -

  • 不带-的su不会读取目标用户的环境配置文件,带-的su才会读

去哪里读取配置文件?

使用su切换到root:

[ltt@db22 Desktop]$ pwd
/home/ltt/Desktop
[ltt@db22 Desktop]$ echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/ltt/bin
[ltt@db22 Desktop]$ su
Password: 
[root@db22 Desktop]# pwd
/home/ltt/Desktop
[root@db22 Desktop]# echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/ltt/bin

使用su -切换到root:

[ltt@db22 Desktop]$ pwd
/home/ltt/Desktop
[ltt@db22 Desktop]$ echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/ltt/bin
[ltt@db22 Desktop]$ su -
Password: 
[root@db22 ~]# pwd
/root
[root@db22 ~]# echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

PATH的配置文件

一般PATH在 HOME/.bashrc HOME/.bash_profile中设置,我们来看一下

[ltt@db22 ~]$ pwd
/home/ltt
[ltt@db22 ~]$ ls -la
total 156
drwx------. 26 ltt  ltt  4096 Jul 31 11:55 .
drwxr-xr-x.  6 root root 4096 May 10 10:49 ..
drwxrwxr-x.  2 ltt  ltt  4096 Apr 10 11:37 .abrt
-rw-------.  1 ltt  ltt    31 Jul 31 11:46 .bash_history
-rw-r--r--.  1 ltt  ltt    18 Feb 22  2013 .bash_logout
-rw-r--r--.  1 ltt  ltt   176 Feb 22  2013 .bash_profile
-rw-r--r--.  1 ltt  ltt   124 Feb 22  2013 .bashrc
... ... ...

.bashrc文件

[ltt@db22 ~]$ cat .bashrc
# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
    . /etc/bashrc
fi

# User specific aliases and functions
[root@db22 ~]# cat .bashrc
# .bashrc

# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# Source global definitions
if [ -f /etc/bashrc ]; then
    . /etc/bashrc
fi

.bash_profile文件

[ltt@db22 ~]$ cat .bash_profile
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin

export PATH
[root@db22 ~]# cat .bash_profile
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin

export PATH

所以读取的配置的文件应该是 .bash_profile文件,这个文件中会导入 .bashrc的定义。.bashrc文件主要定义一些命令别名和函数,PATH变量设置在.bash_profile文件中。

GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐