我登录到一个系统,该系统读取我的 bashrc 文件并加载一些可供使用的软件。
我想根据我登录的 Linux 系统加载给定的 bashrc 文件。
具体来说,如果我登录到 centOS 6 的系统,我想加载我的 centos6 bashrc:
cat /etc/*-release
CentOS release 6.4 (Final)
LSB_VERSION=base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarch
CentOS release 6.4 (Final)
CentOS release 6.4 (Final)
如果我登录到 centOS 5.7 的系统,我想加载我的 centOS 5.7 bashrc。
cat /etc/*-release
CentOS release 5.7 (Final)
我正在考虑在我的主目录中有 3 个 bashrc 文件:
.bashrc 带有 if 条件,这样 if 发现我正在登录到 centOS6 就会运行,
source ~/.bashrc.centos6
还有一个else,这样如果发现我正在登录centOS5.7就会运行,
source ~/.bashrc.centos5
所以我想我的 .bashrc 代码看起来像这样:
if cat /etc/*-release == "CentOs release 6.4"
source ~/.bashrc.centos6
elif cat /etc/*-release == "CentOs release 5.7"
source ~/.bashrc.centos5
我对 bash 脚本还是个新手,所以我不知道如何做到这一点,也不知道这是否是实现我的目标的最佳方法。
答案1
使用lsb_release
命令(应该默认情况下在大多数发行版中):
shopt -s nocasematch
if [ -x "$(which lsb_release)" ]; then
case "$(lsb_release -si)" in
*centos*)
case "$(lsb_release -sr)" in
5.7*)
source ~/.bashrc.centos5.7
;;
5*)
# source something for any other version 5 minor release
;;
6*)
source ~/.bashrc.centos6
;;
esac
;;
esac
fi
shopt -u nocasematch
取决于lsb_release -si
和的确切输出lsb_release -sr
。您可以根据需要添加更多案例。
答案2
这是一个完美的用例,因为${parameter+substitution}
我们毕竟讨论的是参数。
_src_release() {
. ${RELEASE:=/path/to/fallback}
} <<GET_RELEASE
${PREFERRED="$(whatever gets you /path/to/preferred)"}
${NEXT_BEST="$(something else gets you /path/to/next/best)"}
${IF_YOU_MUST="$(get /the/third/option)"}
${RELEASE="${PREFERRED:-"${NEXT_BEST:-"${IF_YOU_MUST}"}"}"}
GET_RELEASE
您还可以在命令替换中的 for 循环中执行所有逻辑,然后$RELEASE
在获得结果时将结果回显出来。这样做的要点是,如果正确使用变量,它可以测试它自己的值。
因此,当您.dot
进行源操作时$RELEASE
,如果其输入中设置的所有变量都没有填充除NULL
值以外的值,那么它只会. /path/to/fallback.
您可以按照您喜欢的方式执行任意多的操作,而且|| short-circuit
只需按照上面的 shell.dot
语句进行测试即可处理其错误 - 这真的很容易使用 - 并且您可以看到它的外观和含义就像它所做的那样,这可以乐于助人。
如果您想这样做,.profile,
但我怀疑最好的方法是使用/etc/login.defs
or$ENV_PATH
对于/etc/passwd.
您想要登录的每个发行版,您可以创建一个仅适用$PATH
于该特定发行版的特殊链接,或者专门将 shell 可执行文件设置为包装器你想要的脚本。这样,它实际上是由登录守护进程处理的,而不是由可破坏的配置文件脚本处理的。