Scripts em /etc/profile.d estão sendo executados duas vezes no login

2

Informações básicas:

Estou tentando configurar um servidor Linux executando o CentOS 7 para vários usuários. Depois de instalar o java, desejo definir globalmente a variável de ambiente $JAVA_HOME para todos os usuários e adicioná-la ao $PATH .

Para fazer isso, fui ao script /etc/profile que é chamado na inicialização. Eu segui o conselho no topo do script:

# It's NOT a good idea to change this file unless you know what you
# are doing. It's much better to create a custom.sh shell script in
# /etc/profile.d/ to make custom changes to your environment, as this
# will prevent the need for merging in future updates.

Eu criei meu próprio script /etc/profile.d/custom.sh para configurar o ambiente para java

custom.sh

# Java configuration
export JAVA_HOME=/usr/lib/jvm/java
export PATH=${JAVA_HOME}/bin:${PATH}

O problema:

Sempre que eu fizer login, o script /etc/profiles.d/custom.sh (juntamente com qualquer outro script que eu coloquei em /etc/profiles.d ) será chamado duas vezes e adicionará $JAVA_HOME ao $PATH duas vezes.

Percebi que isso parece acontecer porque todos os scripts em /etc/profiles.d são chamados de /etc/profile AND /etc/bashrc .

# This is in both /etc/profile and /etc/bashrc
for i in /etc/profile.d/*.sh ; do
    if [ -r "$i" ]; then
        if [ "${-#*i}" != "$-" ]; then
            . "$i"
        else
            . "$i" >/dev/null
        fi
    fi
done

Isso realmente não parece estar correto, mas eu fiz algumas pesquisas e parece que isso parece ser o jeito que é ...

Perguntas:

  1. Este é um bug no sistema operacional do CentOS 7?

  2. Existe uma boa solução alternativa que eu possa usar para criar configurações de ambiente global sem que elas sejam definidas duas vezes? (Eu não quero configurá-los em /etc/environment porque não posso usar variáveis bash nesse arquivo.)

por tjwrona1992 27.12.2017 / 19:40

1 resposta

0

Eu tenho gerado centenas de centos nos últimos 6 meses, aprimorando-os de algumas maneiras, e nunca vi o que você descreve. Como o dito Thomas, por padrão, o /root/.bashrc não chama scripts de / source em /etc/profile.d.

EDITAR: Na verdade, /root/.bashrc DOES source /etc/prodile.d/*, por / etc / bashrc, e previne os ecos:

# Only display echos from profile.d scripts if we are no login shell
# and interactive - otherwise just process them to set envvars
for i in /etc/profile.d/*.sh; do
    if [ -r "$i" ]; then
        if [ "$PS1" ]; then
            . "$i"
        else
            . "$i" >/dev/null
        fi
    fi
done

Acho que meus problemas recentes eram diferentes, o que eu tive que resolvê-los rapidamente e não gostei o suficiente. Minhas desculpas.

RESPOSTA ANTIGA

1 / Eu acho que realmente não é um bug (o que ISO você conseguiu para o seu centos 7? Você md5sum-lo? Fazendo essa pergunta soa realmente estranho para mim)

2 / e, em seguida, não há solução alternativa, mas removendo o código que faz os scripts de origem duas vezes?

/etc/profiles.d parece ser o lugar certo para colocar alguns scripts, se eles estiverem "silenciosos", significando definir algumas variáveis de ambiente, mas não fazer echo ou chamar algum traço dinâmico, ou interagir de algumas maneiras ruins algum ponto, com outros scripts que você executará (adquiriu a experiência com a instalação do netdata ultimamente).

Alguns pontos interessantes para ler em unix.stackexchange.

    
por 27.12.2017 / 22:58