Desvincular variáveis bash referentes a diretórios inexistentes

2

Eu tenho um arquivo que é originado por um aplicativo, adicionando diretórios relevantes a $ PATH e $ LD_LIBRARY_PATH.

Isso é bom, mas resulta em uma poluição um tanto excessiva do $ PATH e $ LD_LIBRARY_PATH, uma vez que alguns caminhos são adicionados, cerca de 2/3 dos quais não existem.

Eu posso testar a existência do diretório usando [ ! -d $VARIABLE_TO_ADD_TO_PATH ] , mas se eu achar que o diretório não existe, desabilitá-lo parece ser mais difícil.

Eu posso escrever (para cada uma das 10 variáveis)

if [ ! -d $VAR ]
    unset VAR
fi

mas eu prefiro ter uma função.

Eu 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 (não $VAR1 $VAR2 $VAR3 ), mas agora eu tenho strings que não se expandem.

Usar eval pode resolver isso para mim, mas outras perguntas, respostas, sites, etc., etc. sugerem que isso geralmente é uma má idéia.

Como posso resolver este problema de uma maneira melhor que 30 linhas de 10x3?

if [ ! -d $VAR ]
    unset VAR
fi
    
por chrisb2244 30.10.2014 / 02:50

1 resposta

1

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 avaliar os diretórios:

$ one=a1; two=a2; three=a3; four=a4

Agora, execute nossa função em relação a essas 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 faz um loop sobre cada argumento na linha de comando.

  • [ -d "${!d}" ] || unset "$d"

    Aqui d refere-se ao nome de uma variável. ${!d} refere-se ao valor da variável denominada d . Isso testa se o valor da variável denominada d é um diretório. Se não estiver, o teste [ será avaliado como falso e a cláusula unset "$d" será executada.

por 30.10.2014 / 03:04