
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 eval
podrí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í
d
se refiere al nombre de una variable.${!d}
se refiere al valor de la variable denominadad
. Esto prueba si el valor de la variable nombradad
es un directorio. Si no es así, la[
prueba se evalúa como falsa yunset "$d"
se ejecuta la cláusula.