
Eu tenho um arquivo originado por um aplicativo, adicionando diretórios relevantes a $PATH e $LD_LIBRARY_PATH.
Isso é bom, mas resulta em uma poluição excessiva de $PATH e $LD_LIBRARY_PATH, já que alguns caminhos são adicionados, cerca de 2/3 dos quais não existem.
Posso testar a existência do diretório usando [ ! -d $VARIABLE_TO_ADD_TO_PATH ]
, mas se descobrir que o diretório não existe, desmarcá-lo parece ser mais difícil.
Posso escrever (para cada uma de talvez 10 variáveis)
if [ ! -d $VAR ]
unset VAR
fi
mas prefiro ter uma função.
Tentei:
_testPathAndUnset()
{
while [ $# -ge 1 ]
do
dirToTest=${1/startPattern/\$startPattern}
if [ ! -d $dirToTest ]
unset $1
fi
shift
done
}
passando valores em um formato como _testPathAndUnset VAR1 VAR2 VAR3
(not $VAR1 $VAR2 $VAR3
), mas agora tenho strings que não se expandem.
Usar eval
pode resolver isso para mim, mas outras perguntas, respostas, sites, etc., sugerem que geralmente é uma má ideia.
Como posso resolver esse problema de uma maneira melhor do que 30 linhas de 10x3?
if [ ! -d $VAR ]
unset VAR
fi
Responder1
Aqui está uma função:
_testPathAndUnset() { for d in "$@"; do [ -d "${!d}" ] || unset "$d"; done; }
Aqui está em uso. Para começar, temos dois diretórios:
$ ls -d */
a1/ a2/
Definimos quatro variáveis de shell que podem ou não ser avaliadas em diretórios:
$ one=a1; two=a2; three=a3; four=a4
Agora, execute nossa função nessas quatro variáveis:
$ _testPathAndUnset one two three four
E observe que apenas duas variáveis permanecem definidas:
$ echo "one=$one two=$two three=$three four=$four"
one=a1 two=a2 three= four=
Detalhes:
for d in "$@"
Isso percorre todos os argumentos na linha de comando.
[ -d "${!d}" ] || unset "$d"
Aqui
d
se refere ao nome de uma variável.${!d}
refere-se ao valor da variável nomeadad
. Isso testa se o valor da variável nomeadad
é um diretório. Caso contrário, o[
teste será avaliado como falso e aunset "$d"
cláusula será executada.