Ubuntu 20.04 LTS使用su切换用户后未加载.profile/.bashrc及环境变量的问题
Ubuntu 20.04 LTS使用su切换用户后未加载.profile/.bashrc及环境变量的问题
嘿,这个问题我之前碰到过,核心原因其实是你创建用户时默认用了dash而不是bash作为登录shell,再加上su命令的默认行为导致的,我给你一步步拆解:
问题根源
useradd的默认shell设置:在Ubuntu 20.04里,useradd命令默认给新用户分配的登录shell是/bin/sh,而这个路径其实是dash shell的软链接(不是bash)。所以你用su test切换后,实际进入的是dash,而不是bash——这就是为什么$BASH_VERSION是空的,因为当前根本不是bash环境!su的默认行为:不带任何参数的su test启动的是非登录式shell,就算默认shell是bash,也不会自动加载.profile这类登录配置文件;而dash本身也不会读取.bashrc(这是bash专属的配置文件)。
你可以验证一下:切换到test用户后执行下面的命令,就能看到当前shell是dash:
$ echo $SHELL $ ps -p $$
解决方法
这里有几个不同场景的解决方案,你可以按需选择:
1. 创建用户时直接指定bash为默认shell
如果是刚创建用户,直接用useradd的--shell参数指定bash:
useradd --create-home --shell /bin/bash test
2. 修改已存在用户的默认shell
如果test用户已经创建好了,用usermod命令更新其默认shell:
usermod --shell /bin/bash test
修改后重新用su test切换,就能进入bash环境,自动加载.bashrc和.profile了。
3. 临时切换到bash环境(不修改默认shell)
如果只是临时需要用bash,不需要修改用户的默认shell,可以用下面两种方式:
- 方式一:用
su - test模拟完整登录环境,启动bash的登录shell(会自动加载.profile和.bashrc):su - test - 方式二:在
su命令里指定直接启动bash:su test -s /bin/bash
补充说明
为什么你的.profile和.bashrc存在但没生效?因为dash shell不会读取.bashrc,而.profile只有在登录式shell下才会被dash加载,但su test默认是非登录式的,所以也不会触发。而bash的话,.profile在登录shell加载,.bashrc在交互式非登录shell加载(Ubuntu的.profile里默认会调用.bashrc,所以登录时两者都会加载)。
备注:内容来源于stack exchange,提问作者e-info128
相关产品推荐
相关产品推荐

