Trabalhando com exportação do comportamento estranho do PATH CentOS

1

Estou tentando modificar a variável PATH em dois scripts diferentes localizado em /etc/profile.d/

  • /etc/profile.d/php.sh

    #!/bin/sh
    PATH=$PATH:/usr/local/php/bin
    export PATH
    
  • /etc/profile.d/mysql.sh

    #!/bin/sh
    PATH=$PATH:/usr/local/mysql/bin
    export PATH
    

Reiniciando o CentOS e verificando a variável PATH (editada), o $ PATH é modificado duas vezes!

[]$ echo $PATH
/usr/lib/qt-3.3/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:
/usr/local/mysql/bin:/usr/local/php/bin:/home/IntUser/bin:/usr/local/mysql/bin:
/usr/local/php/bin
[]$ 

No modo raiz:

[]$ su
Password: 
[]# 

O $ PATH é modificado 3 vezes!

[]# echo $PATH
/usr/lib/qt-3.3/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:
/usr/local/mysql/bin:/usr/local/php/bin:/home/IntUser/bin:/usr/local/mysql/bin:
/usr/local/php/bin:/usr/local//mysql/bin:/usr/local/php/bin
[]# 

Por que não é atribuído apenas uma vez?

    
por QA_Col 05.07.2015 / 03:33

2 respostas

1

Veja a correção: substitua o conteúdo do seu arquivo /etc/profile.d/php.sh por:

pathmunge /usr/local/php/bin after

e de forma semelhante para o arquivo /etc/profile.d/mysql.sh :

pathmunge /usr/local/mysql/bin after

A explicação é que os arquivos em /etc/profile.d/*.sh são originados por /etc/profile (que é originado por um shell bash de login).

Como os arquivos são originados, é como eles faziam parte de /etc/profile , então eles podem usar quaisquer variáveis e funções nesse arquivo. pathmunge é tal uma função (no meu fedora 20 de qualquer forma), cujo único propósito é adicionar um novo diretório para o PATH , mas somente se ainda não estiver lá. A palavra-chave after adiciona o novo diretório ao final do PATH .

Portanto, você não terá duplicatas. No entanto, eu não sei porque você os tem em primeiro lugar.

    
por 05.07.2015 / 18:31
0

Isso acontece porque algo em sua configuração está carregando /etc/profile várias vezes. Você precisa localizá-lo e corrigi-lo.

O arquivo /etc/profile é lido por um shell de login. Ele também é lido ao efetuar login em uma sessão gráfica em várias plataformas (mas depende do gerenciador de exibição, do gerenciador de sessões e de como sua distribuição é configurada).

Um possível problema é que você está solicitando que /etc/profile seja lido em algum outro local, como ~/.bashrc . Se for esse o caso, remova-o. Execute grep -s profile ~/.* para ver possíveis infratores. Como a execução de su/etc/profile , deve haver pelo menos uma instância desse problema, provavelmente com .bashrc .

Outro possível problema é se você executar um shell de login quando abrir um terminal em uma sessão da GUI. A correção é, então, não executar um shell de login - você já está conectado à sessão GUI, o terminal é um aplicativo comum.

Dado que você tem uma ocorrência dos diretórios antes de /home/IntUser/bin e outra depois, /etc/profile está sendo lido uma segunda vez após a parte que adiciona /home/IntUser/bin .

Como alternativa, se você não quiser corrigir sua configuração, poderá adicionar o diretório ao PATH somente se ainda não estiver lá.

case :$PATH: in
  *:/usr/local/php/bin:*) :;;
  *) PATH=$PATH:/usr/local/php/bin;;
esac
    
por 06.07.2015 / 00:59