Como refletir as alterações no PATH como feitas por um script de usuário

0

Eu tenho um script que faz uma verificação básica de integridade do PATH raiz e insere uma linha em ~/.bash_profile para o meu script, para que as alterações feitas no script PATH sejam permanentes nas reinicializações:

cat path_clean
#!/bin/bash

OLD_PATH='echo $PATH'

OIFS=$IFS
IFS=:
for path in ${OLD_PATH}; do
    [ -d "${path}" ] || continue
    paths=( "${paths[@]}" "${path}" )
done

while read -r stat owner path; do
    [ "${owner}${stat:5:1}${stat:8:1}" = 'root--' ] || continue
    newpath="${newpath}:${path}"
done < <(stat -c "%A:%U:%n" "${paths[@]}" 2>/dev/null)

IFS=${OIFS}

NEW_PATH=${newpath#:}
export PATH=${NEW_PATH}
egrep "^[ ]*if.*fi;" ~/.bash_profile &> /dev/null
if [ $? -ne 0 ];
then
   echo 'if [ -f /root/path_clean ]; then source /root/path_clean; fi;' >>     ~/.bash_profile
fi

Tudo é executado como esperado quando executo o script pela primeira vez assim:

./path_clean
. ~/.bash_profile

Mas o script tem um problema. Se eu faço . ~/.bash_profile várias vezes, vejo o valor na variável PATH se repetindo a cada vez.

Por exemplo, antes da execução do script, meu PATH é:

[root@labeir1 ~]# echo $PATH
    /usr/bin/X11:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/ulticom/diameter/bin:/apps/omni/bin

Agora, depois de executar . ~/.bash_profile pela primeira vez, tudo está ok:

[root@labeir1 ~]# ./path_clean
[root@labeir1 ~]# echo $PATH <--still same as original 'PATH', which is ok
   /usr/bin/X11:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/ulticom/diameter/bin:/apps/omni/bin:/root/bin
[root@labeir1 ~]# . ~/.bash_profile <--now sourcing '.bash_profile'1st time
[root@labeir1 ~]# echo $PATH <--my script has changed 'PATH' fine.
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/ulticom/diameter/bin:/apps/omni/bin
[root@labeir1 ~]# . ~/.bash_profile
[root@labeir1 ~]# echo $PATH <-- problem starts
    /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/ulticom/diameter/bin:/apps/omni/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/ulticom/diameter/bin:/apps/omni/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/ulticom/diameter/bin:/apps/omni/bin
[root@labeir1 ~]# . ~/.bash_profile
[root@labeir1 ~]# echo $PATH
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/ulticom/diameter/bin:/apps/omni/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/ulticom/diameter/bin:/apps/omni/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/ulticom/diameter/bin:/apps/omni/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/ulticom/diameter/bin:/apps/omni/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/ulticom/diameter/bin:/apps/omni/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/ulticom/diameter/bin:/apps/omni/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/ulticom/diameter/bin:/apps/omni/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/ulticom/diameter/bin:/apps/omni/bin

Por favor, sugira as alterações a serem feitas no script para que ele funcione bem e elimine esse problema.

    
por dig_123 27.06.2015 / 21:56

2 respostas

0

Use o cheque correto.

[ -d … ] verifica se o caminho fornecido é um diretório, o que obviamente não é seu script.

Você provavelmente queria -f , -s ou -e .

    
por 27.06.2015 / 22:03
0

As duas linhas que você adicionou:

echo 'if [ -d /root/path_clean ]; then source /root/path_clean; fi;' >> /etc/profile
echo 'if [ -d /root/path_clean ]; then source /root/path_clean; fi; >> ~/.bash_profile

verifique a existência de um diretório ; você provavelmente quis dizer:

echo 'if [ -f /root/path_clean ]; then source /root/path_clean; fi;' >> /etc/profile
echo 'if [ -f /root/path_clean ]; then source /root/path_clean; fi; >> ~/.bash_profile

Observe o "-f" dentro dos colchetes.

    
por 27.06.2015 / 23:21

Tags