You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu 20.04 LTS使用su切换用户后未加载.profile/.bashrc及环境变量的问题

Ubuntu 20.04 LTS使用su切换用户后未加载.profile/.bashrc及环境变量的问题

嘿,这个问题我之前碰到过,核心原因其实是你创建用户时默认用了dash而不是bash作为登录shell,再加上su命令的默认行为导致的,我给你一步步拆解:

问题根源

  1. useradd的默认shell设置:在Ubuntu 20.04里,useradd命令默认给新用户分配的登录shell是/bin/sh,而这个路径其实是dash shell的软链接(不是bash)。所以你用su test切换后,实际进入的是dash,而不是bash——这就是为什么$BASH_VERSION是空的,因为当前根本不是bash环境!
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 13:24:35