A veces uso, $PROJECT_HOME/*
para eliminar todos los archivos del proyecto. Cuando PROJECT_HOME
no se establece la variable de entorno (porque lo hice su
y el nuevo usuario no tiene esta variable de entorno establecida), comienza a eliminar todos los archivos de la carpeta raíz. Esto es apocalíptico.
¿Cómo puedo configurar el bash
error de lanzamiento cuando uso una variable de entorno indefinida en el shell?
bash
shell
environment-variables
Comunidad
fuente
fuente
set -u
Hará lo que quieras.[ -z "$VAR" ]
funciona con un no inicializadoVAR
también. La inicialización fue solo para mostrar el comportamiento indeseable. Mi punto es que si alguna vez sus vars se inicializan en cadenas vacías, de cualquier manera, y usted correrm -r "$PROJECT_HOME"/*
confiando erróneamenteset -u
, obtendrá el comportamiento "apocalíptico". IHMO, es mejor prevenir que curar cuando se trata de proteger todo el contenido de su computadora.set -u
no es seguro.PROJECT_HOME=/etc
? Simplemente verificar un valor vacío no es suficiente para prevenir el cataclismo. No debe usar variables de usuarios no confiables cuando se ejecuta como root.Respuestas:
En el shell POSIX, puede usar set -u :
o usando la expansión de parámetros :
En su caso, debe usar en
:?
lugar de?
fallar también en las variables establecidas pero vacías:fuente
Esto también detectará el caso donde
PROJECT_HOME
se establece pero no contiene nada.Ejemplo:
1) Esto eliminará prácticamente todo lo que pueda eliminar en su sistema (salvo los archivos de puntos en el interior
/
(generalmente no hay ninguno)):2) Esto no hará nada:
Eliminar completamente su proyecto y volver a crearlo podría ser otra opción (si también desea deshacerse de los archivos de puntos):
fuente
-z
está bien, pero como$PROJECT_HOME
se supone que es un directorio, tal vez-d
sería mejor.[[ -d $PROJECT_HOME ]] && rm -r "$PROJECT_HOME"
.-d
cheque ocultaría ese error. Creo que es mejor si continúarm
y serm
queja en voz alta.[[ -d $PROJECT_HOME ]] && rm -r "$PROJECT_HOME"
no hará nada, en silencio. Pero[[ -z $PROJECT_HOME ]] || rm -r "$PROJECT_HOME"
eliminará silenciosamente "$ PROJECT_HOME", incluso si se trata de un archivo que no es un directorio. Recibir un mensaje de error nunca es un problema:if [[ -d $PROJECT_HOME ]]; then rm -r "$PROJECT_HOME"; else printf '%s is not a directory\n' "$PROJECT_HOME" >&2; fi
PROJECT_HOME="/."
...Otra forma de hacer esto:
Hay muchas sustituciones variables, la anterior es cuando "somevar" está vacío (y en ese caso intenta eliminar
/tmp/or_this_if_somevar_is_empty/*
)fuente
rm -fr ${ENV_VAR:?suitably caustic message here}/*
, pero podría valer la pena la comprobación de que el valor no se asigna al directorio raíz, observando que hay muchas maneras de subvertir pruebas sencillas://
,/..
,/usr/who/../..
, ...