Adicione o diretório apenas uma vez a qualquer variável

Respostas:

1

Dada uma variação de pathmunge em / etc / profile

munge () {
    if [[ ":${!1}:" != *:"$2":* ]]; then
        if [[ $3 == after ]]; then
            declare -g $1="${!1}:$2"
        else
            declare -g $1="$2:${!1}"
        fi
    fi
}

Nós podemos fazer:

$ A=a
$ munge A b after
$ echo $A
a:b
$ munge A c before
$ echo $A
c:a:b
$ munge A a before
$ echo $A
c:a:b
glenn jackman
fonte
1

De acordo com este artigo, http://www.linuxjournal.com/content/return-values-bash-functions , é possível modificar uma variável externa, dado seu nome, assim:

function myfunc()
{
    local  __resultvar=$1
    local  myresult='some value'
    eval $__resultvar="'$myresult'"
}

myfunc result
echo $result

Agora, usando este script e a pergunta original, escrevi duas funções, uma para adicionar antes do valor atual e outra para adicionar depois:

function add_directory_before()
{
    local VAR=$1
    local VALUE=$(eval echo \$${VAR})
    if [ -d $2 ] && [[ ":$VALUE:" != *":$2:"* ]] ; then
        eval $VAR=$2:$VALUE
    fi
}

function add_directory_after()
{
    local VAR=$1
    local VALUE=$(eval echo \$${VAR})
    if [ -d $2 ] && [[ ":$VALUE:" != *":$2:"* ]] ; then
        eval $VAR=$2:$VALUE
    fi
}

e o uso:

add_directory_after LD_LIBRARY_PATH /usr/local/lib64

ou

add_directory_before PATH $HOME/bin
user666412
fonte
Com bash, não precisa eval: local value="${!1}" - isso é "indireto variável", veja gnu.org/software/bash/manual/…
glenn jackman
Além disso, saia do hábito de usar o ALLCAPSVARS. Deixe aqueles para o shell. Um dia você acidentalmente escreve PATH=foo e depois me pergunto por que seu roteiro está quebrado
glenn jackman