Por que recebo entradas duplicadas no meu $ PATH?

1

Estou usando o Ubuntu 9.10 (kármico). E meu ~/.pam_environment é semelhante ao seguinte.

PATH            DEFAULT=${PATH}:~/Adobe/Reader9/bin:~/texlive/2009/bin/x86_64-linux
GIT_EDITOR      DEFAULT=vim
MANPATH         DEFAULT=${MANPATH}:~/texlive/2009/texmf/doc/man
INFOPATH        DEFAULT=${INFOPATH}:~/texlive/2009/texmf/doc/info

Mas, echo $PATH me retorna entradas duplicadas da seguinte forma.

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:~/Adobe/Reader9/bin:~/texlive/2009/bin/x86_64-linux:~/Adobe/Reader9/bin:~/texlive/2009/bin/x86_64-linux

Eu tentei substituir DEFAULT por OVERRIDE no meu arquivo ~/.pam_environment . Mas isso não ajudou.

Alguém sabe o que há de errado com meu ~/.pam_environment ?

    
por reprogrammer 29.04.2010 / 01:21

3 respostas

3

O problema parece derivar do fato de que pam_env é padronizado para ler o usuário ~/.pam_environment toda vez que é invocado. Muitos métodos de login (cron, lightdm, lightdm-autologin, login, sshd e su na minha máquina) invocam pam_env duas vezes: uma vez para ler os arquivos /etc/environment e ~/.pam_environment , e uma vez para ler o /etc/default/locale Arquivo. Em nenhum dos casos o sinalizador user_readenv está definido, portanto, pam_env lê e atua com ~/.pam_environment duas vezes.

Para corrigir isso, acesse o diretório /etc/pam.d e adicione o seguinte a cada linha na qual pam_env é invocado com a opção envfile=/etc/default/locale :

user_readenv=0
    
por 09.01.2012 / 20:35
1

Verifique se seu /etc/pam.d/ que pam_env.so não foi carregado duas vezes de alguma forma, como em session e em auth .

    
por 01.05.2010 / 01:04
0

Não é uma resposta exata, mas possivelmente útil para outras pessoas que têm problemas de duplicação

A partir da resposta de aceitação recebida do Stack Overflow: Como manipulo elementos $ PATH em scripts de shell? desenvolveu um conjunto de ferramentas ligeiramente grande. A maior parte do crédito aqui deve ir para Jonathan Leffler que forneceu o modelo que eu usei para escrevê-los.

Adicionar sem duplicar

# Insure that a path element exists by adding it to the end if it does not
#
#   $1 name of the shell variable to set (e.g. PATH)
#   $3 the path element that we want to insure exists
function insure_path () {
    local path=$1
    local list=$(eval echo '$'$path)
    local pat=$2

    checkstr=$(echo "$list" | tr ":" "\n" | grep -Fm 1 "$pat")
    if [ "$checkstr" ] 
    then
        true
    else
        export $path=$(echo $list:$pat | sed -e 's|\(:\):*||g' -e 's|:$||' -e'
s|^:||')
    fi
}

# Insure that a path element exists by adding it to the front if it does not
#
#   $1 name of the shell variable to set (e.g. PATH)
#   $2 the path element that we want to insure exists
function insure_path_front () {
    local path=$1
    local list=$(eval echo '$'$path)
    local pat=$2

    checkstr=$(echo "$list" | tr ":" "\n" | grep -Fm 1 "$pat")
    if [ $checkstr ] 
    then
        true
    else
        export $path=$(echo $pat:$list | sed -e 's|\(:\):*||g' -e 's|:$||' -e'
s|^:||')
    fi
}

Remover duplicados existentes

# Remove duplicates from a path. Preferes the ealiest instance of each
# duplicate because this preserves the semantics of the existing path
#
#   $1 name of the shell variable to set (e.g. PATH)
function unduplicate_path () {
    local path=$1
    local list=$(eval echo '$'$path)
    local split_list=$(echo "$list" | tr ":" " ")
    local tempp=""
    # Build the new version of $path from scrath
    for p in $split_list
    do
        insure_path_back tempp $p
    done
    # Now replace the existing version
    export $path=$tempp
}
    
por 09.01.2012 / 22:10