加横杠(-)或 -l 参数使 su 模拟完整登录,切换家目录、重设环境变量、执行目标用户初始化文件并启动 login shell;不加则仅切换身份,环境不变,易致命令失败或路径异常。

加横杠(-)或 -l 参数,是为了让 su 切换用户时模拟一次完整登录,从而加载目标用户的全部环境变量、配置文件和家目录。不加横杠,只是“身份切换”,环境几乎不变——这是很多命令执行失败或路径异常的根源。
加横杠的核心作用
加 - 后,su 会:
- 把当前工作目录切换到目标用户的家目录(如
/home/username或/root) - 重设关键环境变量:HOME、SHELL、USER、PATH、MAIL 等,全部按目标用户配置来
- 读取并执行目标用户的 shell 初始化文件(如
~/.bash_profile、~/.bashrc、~/.profile) - 启动一个 login shell,行为与直接用该用户 SSH 登录一致
常见写法与效果对比
推荐写法(带横杠):
-
su -→ 默认切换为 root,并加载 root 的完整环境 -
su - username→ 切换到指定用户,同时刷新环境、进入其家目录 -
su -l username→ 效果同上,“-l” 是 “--login” 的缩写,语义更明确
不加横杠的风险示例:
-
su username→ 身份变了,但PWD还在原目录,PATH仍是原用户的,HOME指向原家目录 - 可能导致
command not found(比如目标用户 PATH 里有 /usr/local/bin,但原用户没加)、配置文件读错、脚本行为异常等
配合文件管理的实际用法
在操作文件时,常需确保权限和路径都符合目标用户上下文:
- 想用 user1 身份查看其家目录下的隐藏配置:
su - user1 -c "ls -la ~"(注意:此处~展开为 user1 的家目录) - 要编辑某个用户专属的配置文件且避免权限混乱:
su - user2,再运行vim ~/.config/app/config.ini - 批量修改某用户家目录下文件归属后验证环境:
su - user3→echo $HOME; which python,确认路径和工具链正确
小提示:横杠可省略用户名,但不能省略本身
su - 和 su - root 等价;su(无横杠)和 su root 也等价。但 su - ≠ su —— 少这个横杠,就不是真正“换人”,只是“换皮”。











