bashrc 根据 Linux 发行版调用其他 bashrc

bashrc 根据 Linux 发行版调用其他 bashrc

我登录到一个系统,该系统读取我的 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.defsor$ENV_PATH对于/etc/passwd.您想要登录的每个发行版,您可以创建一个仅适用$PATH于该特定发行版的特殊链接,或者专门将 shell 可执行文件设置为包装器你想要的脚本。这样,它实际上是由登录守护进程处理的,而不是由可破坏的配置文件脚本处理的。

相关内容