Acrescentar à variável do tipo PATH sem criar dois pontos iniciais se não estiver definido

6

Eu preciso acrescentar um diretório a PKG_CONFIG_PATH . Normalmente, eu usaria o padrão

export PKG_CONFIG_PATH=${PKG_CONFIG_PATH}:$(pyenv prefix)/lib/pkgconfig

mas PKG_CONFIG_PATH não foi definido anteriormente no meu sistema. Portanto, a variável começa com um caractere : , que diz para procurar primeiro no diretório atual. Eu não quero isso. Eu decidi o seguinte,

export PKG_CONFIG_PATH=${PKG_CONFIG_PATH}${PKG_CONFIG_PATH:+:}$(pyenv prefix)/lib/pkgconfig

mas isso parece tão feio. Existe uma maneira melhor? Qual é a maneira apropriada de anexar condicionalmente os dois pontos se e somente se a variável já foi definida?

    
por scottbb 18.10.2014 / 21:14

2 respostas

9

Você está no caminho certo com o operador de expansão ${:+} , você só precisa modificá-lo um pouco:

V=${V:+${V}:}new_V

As primeiras chaves se expandem para $V e os dois pontos iff V já estão definidos para nada - o que é exatamente o que você precisa (e provavelmente também uma das razões para a existência de o operador).

Assim, no seu caso:

export "PKG_CONFIG_PATH=${PKG_CONFIG_PATH:+${PKG_CONFIG_PATH}:}$(pyenv prefix)/lib/pkgconfig"
    
por 18.10.2014 / 21:48
1

Ultimamente, eu configurei GNU stow em minhas máquinas para armazenar coisas para todo o usuário, como bibliotecas em ~/.local , e tive problemas ao definir LD_LIBRARY_PATH , CPATH e LIBRARY_PATH , inadvertidamente colocando lá um cólon e assim quebrando coisas.

Então eu encontrei sua pergunta e a resposta não era exatamente elegante ;-), e eu escrevi uma pequena função para lidar com isso, por favor, encontre aqui: link

## Copyright (C) 2018 Alex Thiessen <[email protected]>
## Copyright (C) 2018 https://unix.stackexchange.com/users/116858/kusalananda
## SPDX-License-Identifier: GPL-2.0-or-later
## <https://spdx.org/licenses/GPL-2.0-or-later.html>

function join() {
    if [ ${#} -eq 0 ]
    then
        echo "\'join\' appends elements separated by colons to a \'bash\' variable " >&2
        echo "usage: join <variable> <element> [element ...]" >&2
        return 1
    fi
    variable="${1}"

    shift
    export ${variable}="${!variable:+${!variable}:}$(IFS=:; echo "${*}")"
}

// editado como sugerido por @Kusalananda

    
por 22.07.2018 / 13:43