【发布时间】:2014-08-22 07:34:31
【问题描述】:
我想知道是否有人有一个从 bash 环境变量中添加/删除路径的好方法(不仅仅是 PATH 变量)。
我的情况是我在没有管理员权限的集群上实现一个简单的类似模块的系统。我希望能够编写如下脚本:
openmpi_module.sh
#!/bin/bash
if [ $1 == "load" ]; then
path_prepend PATH "$HOME/apps/openmpi-1.8.1-gcc-4.9.0/bin"
path_prepend CPATH "$HOME/apps/openmpi-1.8.1-gcc-4.9.0/include"
...
fi
if [ $1 == "unload" ]; then
path_remove PATH "$HOME/apps/openmpi-1.8.1-gcc-4.9.0/bin"
path_remove CPATH "$HOME/apps/openmpi-1.8.1-gcc-4.9.0/include"
...
fi
我发现 questions dealing 专门修改了 PATH 变量,但不是一般的环境变量。这些解决方案的通用版本似乎是一个有用的工具。
我目前的解决方案是在我的.bash_profile 中获取以下内容,但我想知道是否有人有更优雅的解决方案(没有安装实际Modules system 的本地副本)。大多数情况下,我对使用这么多 evals 和 echos 感到不舒服,我更愿意避免这种做法。
#!/bin/bash
# modified from https://stackoverflow.com/questions/370047/
function path_remove () {
eval export $(echo $1=\$\(echo -n $(echo -n "\$$1 | awk -v RS=: -v ORS=: '\$0 != \"'$2'\"' | sed 's/:\$//'")\))
}
function path_append () {
path_remove $1 $2
eval export $1="\$$1:$2"
}
function path_prepend () {
path_remove $1 $2
eval export $1="$2:\$$1"
}
【问题讨论】:
-
确实,
evals 是邪恶的,但你不需要它们;参见 BashFAQ #6,关于使用间接变量:mywiki.wooledge.org/BashFAQ/006 -
顺便说一句,
echo -n和echo -E是 bash 不仅扩展 POSIX,而且实际上破坏了与标准的兼容性的少数几个地方。最好避免使用它们,并在您想做任何花哨的事情时使用printf。
标签: bash