Variáveis ​​bash não definidas referentes a diretórios inexistentes

Variáveis ​​bash não definidas referentes a diretórios inexistentes

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 evalpode 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 dse refere ao nome de uma variável. ${!d}refere-se ao valor da variável nomeada d. Isso testa se o valor da variável nomeada dé um diretório. Caso contrário, o [teste será avaliado como falso e a unset "$d"cláusula será executada.

informação relacionada