A veces uso, $PROJECT_HOME/*para eliminar todos los archivos del proyecto. Cuando PROJECT_HOMEno se establece la variable de entorno (porque lo hice suy 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 basherror de lanzamiento cuando uso una variable de entorno indefinida en el shell?
bash
shell
environment-variables
Comunidad
fuente
fuente

set -uHará lo que quieras.[ -z "$VAR" ]funciona con un no inicializadoVARtambié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 -uno 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_HOMEse 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
-zestá bien, pero como$PROJECT_HOMEse supone que es un directorio, tal vez-dsería mejor.[[ -d $PROJECT_HOME ]] && rm -r "$PROJECT_HOME".-dcheque ocultaría ese error. Creo que es mejor si continúarmy sermqueja 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; fiPROJECT_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/../.., ...