1. 用户切换的本质差异
在Linux系统中,用户切换是系统管理员和开发者的日常操作。su(switch user)命令看似简单,但有无短横线的区别却直接影响着后续操作的环境上下文。理解这个差异,能避免90%因环境变量引发的"灵异问题"。
1.1 身份切换与环境继承
su mysql这种不带短横线的用法,实际上执行的是"半切换"——只改变用户身份标识(UID/GID),而保留了原用户的所有环境变量和工作目录。这就像你穿着别人的工作服,但口袋里装的还是自己的工具。
我曾遇到过这样的案例:某DBA用su mysql切换到数据库用户后,执行mysqld_safe启动服务,结果始终报"command not found"。排查发现PATH变量仍保留着root用户的设置,而MySQL的可执行文件路径并未包含其中。
1.2 完整环境加载机制
相比之下,su - mysql(注意短横线前的空格)会触发完整的登录流程:
- 切换用户身份
- 跳转到目标用户家目录(通过
cd ~实现) - 按顺序加载环境配置文件:
/etc/profile(系统级配置)~/.bash_profile或~/.profile(用户级配置)~/.bashrc(交互式shell配置)
这个流程与实际登录完全一致。在MySQL场景下尤为关键,因为数据库服务通常会在.profile中设置关键的MYSQL_HOME、PATH等变量。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术细节深度解析
2.1 环境变量继承对比
通过实验可以清晰看到差异。先用root执行:
bash复制env | grep -E 'USER|HOME|PATH' > root_env.txt
su mysql -c "env | grep -E 'USER|HOME|PATH'" > su_mysql_env.txt
su - mysql -c "env | grep -E 'USER|HOME|PATH'" > su-dash_mysql_env.txt
对比三个文件会发现:
su mysql保留root的PATH和HOMEsu - mysql使用mysql用户的PATH(通常包含/usr/loca
