bashrc que chama outro bashrc dependendo da distribuição linux

2

Eu faço login em um sistema que lê meu arquivo bashrc e carrega alguns softwares prontos para uso.

Gostaria de carregar um determinado arquivo bashrc dependendo do sistema linux no qual estou logando.

Especificamente, se estou logando em um sistema com o centOS 6, eu gostaria de carregar meu 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)

e se estou logando em um sistema com o centOS 5.7, gostaria de carregar meu centOS 5.7 bashrc.

cat /etc/*-release
CentOS release 5.7 (Final)

Estou pensando em ter três arquivos bashrc em meu diretório inicial:

.bashrc com uma condição if tal que se encontrar que eu estava logando em centOS6 seria executado,

source ~/.bashrc.centos6

e um outro, de tal forma que se encontrar que eu estava logando em centOS5.7 seria executado,

source ~/.bashrc.centos5

Então, eu acho que meu código .bashrc seria parecido com isto:

if cat /etc/*-release == "CentOs release 6.4"
   source ~/.bashrc.centos6
elif cat /etc/*-release == "CentOs release 5.7"
   source ~/.bashrc.centos5

Eu ainda sou novo no bash scripting, então não tenho idéia de como eu faria isso e se é um bom caminho para alcançar meu objetivo.

    
por Dnaiel 05.04.2014 / 23:39

2 respostas

1

Usando o comando lsb_release ( deve estar na maioria das distros por padrão):

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

Dependendo da saída exata de lsb_release -si e lsb_release -sr . Você pode adicionar mais casos conforme necessário.

    
por 06.04.2014 / 00:08
0

Este é um caso de uso perfeito para ${parameter+substitution} , já que estamos falando de parâmetros.

  _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

Você também pode fazer toda a lógica em um loop for na substituição do comando e, em seguida, fazer com que os resultados sejam exibidos em $RELEASE quando você os obtiver. O ponto disso é que a variável pode testar seu próprio valor se você usá-lo corretamente.

Portanto, quando você .dot source $RELEASE se nenhuma dessas variáveis definidas em sua entrada tiverem sido preenchidas com valores diferentes de NULL , ela será apenas . /path/to/fallback.

Você pode fazer quantos você quiser dessa forma, mas também um || short-circuit test seguindo a instrução .dot do shell acima tratará de seus erros - isso é realmente fácil de usar - e você pode procurar e significa como o que faz, o que pode ser útil.

Isso se você quiser fazer isso em .profile, , mas eu suspeito que a melhor maneira é em /etc/login.defs com $ENV_PATH ou /etc/passwd. . Para cada distro em que você deseja fazer login você pode criar um link especial que apenas $PATH para essa distro específica ou definir especificamente o executável do shell como um script de wrapper para o que você deseja. Dessa forma, ele é tratado pelo daemon de login e não por scripts de perfil subvertíveis.

    
por 06.04.2014 / 00:43

Tags