Variables de bash no configuradas que hacen referencia a directorios inexistentes

Variables de bash no configuradas que hacen referencia a directorios inexistentes

Tengo un archivo que proviene de una aplicación y agrega directorios relevantes a $PATH y $LD_LIBRARY_PATH.

Esto está bien, pero da como resultado una contaminación algo excesiva de $PATH y $LD_LIBRARY_PATH, ya que se agregan bastantes rutas, aproximadamente 2/3 de las cuales no existen.

Puedo probar la existencia del directorio usando [ ! -d $VARIABLE_TO_ADD_TO_PATH ], pero si encuentro que el directorio no existe, desarmarlo parece ser más difícil.

Puedo escribir (para cada una de quizás 10 variables)

if [ ! -d $VAR ]
    unset VAR
fi

pero prefiero tener una función.

Lo intenté:

_testPathAndUnset()
{
   while [ $# -ge 1 ]
   do
      dirToTest=${1/startPattern/\$startPattern}
      if [ ! -d $dirToTest ]
         unset $1
      fi
      shift
   done
}

pasando valores en forma como _testPathAndUnset VAR1 VAR2 VAR3(no $VAR1 $VAR2 $VAR3), pero ahora tengo cadenas que no se expanden.

Usarlo evalpodría resolver esto por mí, pero otras preguntas, respuestas, sitios web, etc., sugieren que generalmente es una mala idea.

¿Cómo puedo resolver este problema mejor que 30 líneas de 10x3?

if [ ! -d $VAR ]
    unset VAR
fi

Respuesta1

Aquí hay una función:

_testPathAndUnset() { for d in "$@"; do [ -d "${!d}" ] || unset "$d"; done; }

Aquí está en uso. Para empezar, tenemos dos directorios:

$ ls -d */
a1/  a2/

Definimos cuatro variables de shell que pueden o no evaluarse como directorios:

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

Ahora, ejecute nuestra función contra esas cuatro variables:

$ _testPathAndUnset one two three four

Y observe que sólo quedan establecidas dos variables:

$ echo "one=$one two=$two three=$three four=$four"
one=a1 two=a2 three= four=

Detalles:

  • for d in "$@"

    Esto recorre cada argumento en la línea de comando.

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

    Aquí dse refiere al nombre de una variable. ${!d}se refiere al valor de la variable denominada d. Esto prueba si el valor de la variable nombrada des un directorio. Si no es así, la [prueba se evalúa como falsa y unset "$d"se ejecuta la cláusula.

información relacionada