Linux (RedHat) `sudo su -l ` 不提供配置文件

Linux (RedHat) `sudo su -l ` 不提供配置文件

<<user_acct>>如前所述,在加载默认配置文件时遇到问题sudo su -l <<user_acct>>

里面.profile

if [ -r "${HOME}/.profile.custom" ]; then
    . "${HOME}/.profile.custom"
fi

根据我读过的内容(例如,类似于此的答案),-l应该已经触发了登录 shell,因此获取了.profile,但它似乎不起作用,因为 中设置的环境变量.profile.custom不存在(而如果我刚刚运行. .profile,它们就会显示出来。

修改后的问题:任何想法为什么或如何解决这个问题

答案1

当它是登录 shell 时,bash 首先查找~/.bash_profile.如果没有找到,它就会寻找~/.bash_login。如果没有找到,它就会寻找~/.profile。无论如何,即使登录 shell 是交互式的,bash 也不会读取~/.bashrc.

我建议坚持 中的以下内容~/.bash_profile,并且不要有~/.bash_login

if [ -e ~/.profile ]; then . ~/.profile; fi
case $- in *i*) if [ -e ~/.bashrc ]; then . ~/.bashrc; fi;; esac

这样,.profile无论您的登录 shell 是 bash 还是其他 sh 变体,您都会被加载,并且.bashrc无论 shell 是否是登录 shell,您都会由 bash 加载。

答案2

不做sudo su,没必要。sudo -i -u loginname就是你想要的。

答案3

问题的作者提供了以下解决方案:

毕竟我找到了解决我的问题的方法...结果证明这是相当微不足道的 - 只需设置环境变量.bash_profile即可设置它们。

根据bash手册页,正如所讨论的这里,

当 bash 作为交互式登录 shell 或带有 --login 选项的非交互式 shell 被调用时,它首先从文件 /etc/profile 中读取并执行命令(如果该文件存在)。读取该文件后,它会按顺序查找 ~/.bash_profile、~/.bash_login 和 ~/.profile,并从第一个存在且可读的文件中读取并执行命令。启动 shell 时可以使用 --noprofile 选项来禁止此行为。

..关键在于第一的一个存在的。

经验教训:阅读“精美”印刷品

相关内容