这个问题让我抓狂。它在我的所有 RHEL 系统上都运行正常,但在 Ubuntu20LTS 上却无法正常工作。
配置:
当所有用户打开终端/konsole 时,环境模块都会通过“/etc/profile.d”中的脚本加载。模块“别名”为我们所有的项目定义别名,所有用户都将在他们的环境中看到这些别名。据我所知,终端/konsole 将打开“交互式非登录 shell”。在我们的配置中,当打开终端/konsole 时,“.bashrc”将被调用。
在 RHEL 上是预期可以运行但在 Ubuntu20LTS 上无法运行的情况:
打开终端或 konsole --> 模块已加载(通过“etc/profile.d/...”中的脚本)-->“aliases”显示模块“aliases”中定义的所有别名(请参阅本文末尾的“.bashrc”内容):
I am .bashrc and was loaded!
[INFO:] $MODULEPATH=/icd/cfg/modules:
Currently Loaded Modulefiles:
1) aliases 2) common 3) aliases_ue
[userXY@host:~]
# alias
alias ATIC183='cd $ICD_PROJ/ATIC183; source $ICD_CFG/env/proj_setup/start_proj.sh'
alias FFT='cd $ICD_PROJ/monarch; source $ICD_CFG/env/proj_setup/start_proj.sh'
alias HXLR0='cd $ICD_PROJ/HXLR0; source $ICD_CFG/env/proj_setup/start_proj.sh'
在Ubuntu20LTS上体验到的:
打开终端 --> 模块已加载 --> “别名” 不显示定义的别名,仅显示来自“.bashrc”的一个定义:
I am .bashrc and was loaded!
[INFO:] $MODULEPATH=/icd/cfg/modules:
Currently Loaded Modulefiles:
1) aliases 2) common 3) aliases_ue
[userXY@host:~]
# alias
alias ll='ls -al'
另外还进行了测试但不起作用:
打开终端 --> 通过“模块加载别名”重新加载模块 --> “别名”不显示定义的别名
打开终端 --> “su userXY” --> 模块已加载 --> “别名” 不显示定义的别名
# su userXY
Password:
I am .bashrc and was loaded!
[INFO:] $MODULEPATH=/icd/cfg/modules:
Currently Loaded Modulefiles:
1) aliases 2) common 3) aliases_ue
[userXY@host:~]
# alias
alias ll='ls -al'
打开终端 --> “bash -l” --> 模块已加载 --> “别名” 不显示已定义的别名,但还加载了其他别名
打开终端 --> “su userXY” --> 模块已加载 --> “bash -l” --> alias” 不显示已定义的别名,但还会加载其他别名
# bash -l
I am .bashrc and was loaded!
[INFO:] $MODULEPATH=/icd/cfg/modules:
Currently Loaded Modulefiles:
1) aliases 2) common 3) aliases_ue
[userXY@host:~]
# alias
alias ll='ls -al'
alias pat='puppet agent -t'
alias su2='sudo su -'
打开终端 --> “sudo su userXY” --> 没有加载任何模块
# sudo su userXY
ERROR: No module path defined
ERROR: No module path defined
I am .bashrc and was loaded!
[INFO:] $MODULEPATH=
No Modulefiles Currently Loaded.
获取别名需要做哪些工作:
打开终端 --> “sudo su userXY” --> 没有加载模块 --> “bash -l” --> alias 显示所有定义的别名
打开终端 --> ssh localhost --> 模块已加载 --> 别名显示所有定义的别名
# sudo su userXY
ERROR: No module path defined
ERROR: No module path defined
I am .bashrc and was loaded!
[INFO:] $MODULEPATH=
No Modulefiles Currently Loaded.
[userXY@host:~]
# bash -l
I am .bashrc and was loaded!
[INFO:] $MODULEPATH=/icd/cfg/modules:
Currently Loaded Modulefiles:
1) aliases 2) common 3) aliases_ue
[userXY@host:~]
# alias
alias ATIC183='cd $ICD_PROJ/ATIC183; source $ICD_CFG/env/proj_setup/start_proj.sh'
alias FFT='cd $ICD_PROJ/monarch; source $ICD_CFG/env/proj_setup/start_proj.sh'
alias HXLR0='cd $ICD_PROJ/HXLR0; source $ICD_CFG/env/proj_setup/start_proj.sh'
看起来这和登录和非登录 shell 有关。但我不明白为什么别名(由加载的模块定义)在一个场景中被覆盖/删除,而在另一个场景中却可用。
这些是我的 $HOME 中的配置文件:
.bash_aliases --> 不存在
.profile——>不存在
.login --> 不存在
.cshrc --> 不存在
.bashrc
#cat .bashrc
case "$0" in
-sh|sh|*/sh) modules_shell=sh ;;
-ksh|ksh|*/ksh) modules_shell=ksh ;;
-zsh|zsh|*/zsh) modules_shell=zsh ;;
-bash|bash|*/bash) modules_shell=bash ;;
esac
module() { eval `/usr/bin/tclsh8.6 /usr/lib/x86_64-linux-gnu/modulecmd.tcl $modules_shell $*`; }
# .bashrc
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
fi
# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=
# User specific aliases and functions
export SVN_EDITOR=vi
#colorized shell prompt
export PS1='[\[\033[1;31m\]\u@\[\033[1;34m\]\h:\[\033[0;32m\]\w\[\033[0m\]]\n# '
# load aliases
module load aliases_ue
#disable beep
xset b off
alias ll="ls -al"
echo "I am .bashrc and was loaded!"
echo -e "[INFO:] \$MODULEPATH=$MODULEPATH\n"
module list
.bash_配置文件
# cat .bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/.local/bin:$HOME/bin
export PATH
.kshrc
# cat .kshrc
# .kshrc
# Source global definitions
if [ -f /etc/kshrc ]; then
. /etc/kshrc
fi
# use emacs editing mode by default
set -o emacs
# User specific aliases and functions
任何提示都非常感谢!
通过从“环境模块”切换到替代的“Lmod”模块实现(这也是我在 RHEL 上使用的“模块”替代方案),我的问题得到了解决。
清除“环境模块”并通过 apt 安装“lmod”后,我按照“Lmod”网站上的本教程进行操作: https ://lmod.readthedocs.io/en/latest/030_installing.html#bash-under-ubuntu
它基本上通过将其添加到“/etc/bash.bashrc”来使交互式非登录 shell(打开终端/konsole 时)加载“/etc/profile.d”下的 *.sh 文件:
使用此设置,打开终端/控制台时将直接加载模块和别名。