1

Я использую Ubuntu 9.10 (кармический). И моя ~/.pam_environment выглядит следующим образом.

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

Но echo $PATH возвращает мне дублированные записи, как показано ниже.

/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

Я попытался заменить DEFAULT на OVERRIDE в моем файле ~/.pam_environment . Но это не помогло.

Кто-нибудь знает, что не так с моей ~/.pam_environment?

3 ответа3

3

Похоже, проблема связана с тем, что по умолчанию pam_env читает пользователя ~/.pam_environment каждом его вызове. Многие методы входа в систему (cron, lightdm, lightdm-autologin, login, sshd и su на моей машине) вызывают pam_env дважды: один раз для чтения файлов /etc/environment и ~/.pam_environment , и один раз для чтения /etc/default/locale файл по умолчанию / локаль . Ни в том, ни в другом случае не установлен флаг user_readenv , поэтому pam_env читает и воздействует на ваше ~/.pam_environment дважды.

Чтобы это исправить, перейдите в каталог /etc/pam.d и добавьте следующие строки в каждой строке , в которой pam_env вызывается с envfile=/etc/default/locale и т.д. / по умолчанию / локаль опции:

user_readenv=0
1

Проверьте ваш /etc/pam.d/ что pam_env.so не загружен дважды, как в session и в auth .

0

Точно не ответ, но, возможно, полезный для других, у которых есть проблемы дублирования


Начиная с ответа на принятие, который я получил от переполнения стека: как мне манипулировать элементами $ PATH в сценариях оболочки? Я разработал немного большой набор инструментов. Большая часть заслуг здесь должна достаться Джонатану Леффлеру, который предоставил модель, которую я использовал при написании этих работ.

Добавить без дублирования

# 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|\(:\):*|\1|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|\(:\):*|\1|g' -e 's|:$||' -e'
s|^:||')
    fi
}

Удалить существующие дубликаты

# 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
}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .