Adicione caminho para $ PATH se ainda não estiver em $ PATH [duplicado]

20

Eu preciso adicionar um caminho em um script bash , mas ele pode ser executado várias vezes:

export PATH=${OPENSHIFT_HOMEDIR}/app-root/runtime/bin/:${PATH}

Eu não quero que esse caminho seja adicionado repetidamente. Como posso adicioná-lo se ainda não estiver em $PATH ?

    
por Jérôme Verstrynge 22.07.2015 / 15:12

4 respostas

36

Primeiro, verifique se o caminho a adicionar já faz parte da variável:

[[ ":$PATH:" != *":/path/to/add:"* ]] && PATH="/path/to/add:${PATH}"

Se /path/to/add já estiver no $PATH , nada acontece, senão é adicionado no começo.

Se você precisar no final, use PATH=${PATH}:/path/to/add .

Editar : no seu caso, ficaria assim:

[[ ":$PATH:" != *":${OPENSHIFT_HOMEDIR}/app-root/runtime/bin:"* ]] && PATH="${OPENSHIFT_HOMEDIR}/app-root/runtime/bin:${PATH}"
    
por 22.07.2015 / 15:22
15

O sysadmin no meu antigo laboratório tinha uma pequena função bacana para isso:

pathmunge () {
        if ! echo "$PATH" | /bin/grep -Eq "(^|:)$1($|:)" ; then
           if [ "$2" = "after" ] ; then
              PATH="$PATH:$1"
           else
              PATH="$1:$PATH"
           fi
        fi
}

Ele verificará se a string fornecida já está no PATH e também permite adicioná-la ao final ou ao início, conforme desejado:

$ echo $PATH
/usr/local/bin:/usr/bin:/bin
$ pathmunge /sbin/             ## Add to the start; default
$ echo $PATH
/sbin/:/usr/local/bin:/usr/bin:/bin
$ pathmunge /usr/sbin/ after   ## Add to the end
$ echo $PATH
/sbin/:/usr/local/bin:/usr/bin:/bin:/usr/sbin/

Eu tenho essa função no meu ~/.profile e uso para modificar meu $PATH .

    
por 22.07.2015 / 15:28
1

Com o GNU sed você pode fazer isso

echo ${PATH} | 
    sed "\|${OPENSHIFT_HOMEDIR}/app-root/runtime/bin|\
        ! s|^|export PATH=${OPENSHIFT_HOMEDIR}/app-root/runtime/bin:|e"
    
por 22.07.2015 / 15:34
1

Se for a mesma string, faça:

set -a -- "$OPENSHIFT_HOMEDIR/app-root/runtime/bin/"
PATH=$1:${PATH#"$1:"}
set +a --

Você pode fazer isso várias vezes e o valor de $PATH não será alterado.

Como alternativa, você pode verificar isso.

set -a -- "$OPENSHIFT_HOMEDIR/app-root/runtime/bin/"
case :${PATH:=$1}: in
(*:"$1":*) ;; (*)
    PATH=$1:$PATH
esac;  set +a --
    
por 22.07.2015 / 15:54