Есть ли разумный способ присоединить новый путь к PATH в bashrc? - PullRequest
1 голос
/ 14 мая 2010

Мне постоянно нужно присоединять новые пути к переменной окружения PATH в .bashrc, как показано ниже: экспорт PATH = / usr / local / bin: $ PATH Затем, чтобы это вступило в силу, я всегда делаю 'source ~ / .bashrc' или '. ~ / .bashrc ', хотя я обнаружил один недостаток, который заставляет меня чувствовать себя неловко.

Если я продолжу это делать, PATH будет становиться все длиннее и длиннее со многими дублированными записями, например, в предыдущей команде, если я получу его дважды, значение PATH будет равно PATH = / usr / local / bin: / usr / local / bin: / usr / local / bin: $ PATH (<- исходный путь). </p>

Есть ли более приличный способ присоединить новый путь к PATH в bashrc, не делая его уродливым?

Ответы [ 6 ]

2 голосов
/ 14 мая 2010

Другой способ - проверить, не установлен ли OPATH. Если это так, установите значение PATH. Это будет ваш оригинальный путь.

if [ "$OPATH" == "" ];
then
    OPATH=$PATH
fi

PATH=~/bin:$OPATH

(код не проверен ...)

1 голос
/ 14 мая 2010

Мой подход похож на rcollyer , но более универсален, имеет дело с приоритетом и использует гораздо больше кода.

function append () {
        local val
        eval val=\$$1
        if [[ x$val = x ]] ; then
                eval $1=$2
        else 
                eval $1="$val:$2"
        fi
}

function is_in() {
        local pattern
        pattern=":$1\$|^$1:|:$1:"
        echo $2 | egrep -q "$pattern" &&  return 0
        return 1
}

function append_if_absent() {
        local val
        eval val=\$$1   
        if ! is_in "$2" "$val" ; then
                append "$1" "$2"
        fi
}

export ROOTSYS=/usr/local/root

append_if_absent LD_LIBRARY_PATH $ROOTSYS/lib/root
append_if_absent PATH $ROOTSYS/bin
1 голос
/ 14 мая 2010

Если вы хотите изменить оболочку, zsh имеет declare -U для этой конкретной цели: она автоматически удалит дубликаты из массива, сохраняя приоритет. Это также позволяет вам использовать $path вместо $PATH.

% PATH=a:b:c:d:c:b:a
% echo $PATH
a:b:c:d:c:b:a
% declare -U PATH
% echo $PATH     

или, для улучшения читаемости, вы можете использовать форму массива, которая автоматически синхронизируется:

% path=(a b c d c b a)
% print $path
a b c d c b a
% print $PATH
a:b:c:d:c:b:a
% declare -U path
% print $path
a b c d
% print $PATH 
a:b:c:d
0 голосов
/ 15 мая 2010

Из моего .bashrc:

pathadd() {
    if [ -d "$1" ] && [[ ":$PATH:" != *":$1:"* ]]; then
        PATH="$PATH:$1"
    fi
}

pathadd /usr/local/bin
pathadd ~/bin
...etc

Обратите внимание, что это добавляет каталоги в конец пути; внесите очевидные изменения, чтобы добавить их в начало.

0 голосов
/ 14 мая 2010

Вот то, что я использовал долгое время: я добавил функцию с именем addpath () в .bash_profile или .bashrc, и затем я могу добавить каталог к ​​пути, зная, что дубликатов не будет. Например:

addpath ~/bin
addpath ~/myproj/bin

Вот источник для addpath ():

function addpath()
{

    if [ $# -eq 0 ]
    then
        echo "  Usage: addpath dir ..."
        return 1
    fi

    local p
    local dir
    local IFS=:
    local found

    for dir; do
        found=0
        for p in $PATH; do
            if [ "$p" = "$dir" ]; then
                found=1
            fi
        done

        if [ "_$found" = "_0" ]; then
            PATH=$PATH:$dir
        fi
    done
}
0 голосов
/ 14 мая 2010

Мое решение - один лайнер:

export PATH=`echo :<new path>:${PATH} | sed -e 's/\:/\n/g' | sort | uniq \
| awk 'BEGIN {ORS=":"} {print $0}'`

, где sed заменяет : новой строкой, sort и uniq удаляет любые дубликаты, а awk восстанавливает путь. Это имеет тот недостаток, что порядок не поддерживается, поэтому, если вы хотите, чтобы программы в одном месте имели приоритет над программами в других местах, это вызовет проблемы. Я не реализовал это, но я думаю, что вы могли бы использовать Perl для поддержания их в порядке, удаляя дубликаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...