Eu preciso anexar um diretório para 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á tiver sido definida?
bash
variable-substitution
scottbb
fonte
fonte
Respostas:
Você está no caminho certo com o
${:+}
operador de expansão, basta modificá-lo um pouco:As primeiras chaves se expandem para
$V
e o cólon iffV
já está definido como nada - o que é exatamente o que você precisa (e provavelmente também uma das razões para a existência do operador).Assim, no seu caso:
fonte
${V}${V:+:}W
vs.${V:+${V}:}W
. De qualquer forma, ambos se sentem muito feios. Eu estava esperando algo ... mais elegante, eu acho?test
- de qualquer maneira, você está testando o valor e escrevendo o varname duas vezes, mas dessa maneira você faz isso em uma única instrução de execução -, dessa maneira é prático , mas nunca conheci um computador elegante .export
. Esse é um ponto muito bom, também ofendi esses detalhes.Ultimamente, eu instalei o GNU stow em minhas máquinas para armazenar coisas de todo o usuário, como bibliotecas,
~/.local
e tive problemas ao definirLD_LIBRARY_PATH
,CPATH
eLIBRARY_PATH
, inadvertidamente, colocando dois pontos lá e quebrando coisas.Então encontrei sua pergunta e a resposta não era exatamente elegante ;-) e escrevi uma pequena função para lidar com isso, localize-a aqui: https://gist.github.com/rico-chet/0229e4c080d9f51a02535dd25a656a8a
// editado como sugerido por @Kusalananda
fonte
( IFS=:; set -- 1 2 3 4 5 6; echo "$*" )
join () { var=$1; shift; export "$var"="$( IFS=:; echo "$*" )"; }
${!variable:+${!variable}:}
no lugar certo funcionou para mim, todos os testes passaram. Encontrar um nome apropriado é uma exersize para o leitor :)