1. Estas dos pruebas devuelven verdadero :
# [ -d ] && echo true || echo false
true
# [ -d $SOME_UNSET_VAR ] && echo true || echo false
true
de acuerdo con POSIX (como lo explica @Tim).
2. Pero esto devuelve falso ( no es cierto como se indica en la pregunta)
# [ -d "" ] && echo true || echo false
false
porque test
se llama con dos argumentos (aunque el segundo es una cadena vacía).
3. Es por eso que es una buena práctica usar en [[ … ]]
lugar de test
( [ … ]
), que proporcionan la mayoría (¿todos?) De los shells actuales. Esta construcción verifica si proporciona suficientes argumentos (de lo contrario, arroja un error y aborta)
# [[ -d ]] && echo true || echo false
bash: unexpected argument `]]' to conditional unary operator
bash: syntax error near `]]'
o simplemente se comporta como uno esperaría:
# [[ -d $SOME_UNSET_VAR ]] && echo true || echo false
false
4. Y, como señaló @Gilles, aún más importante es duplicar las sustituciones. Por lo tanto, se -d "$SOME_UNSET_VAR"
expande -d ""
y devuelve falso incluso con test
(igual al caso 2). Por lo tanto, esto también es compatible con el shell Bourne sh
:
# [ -d "$SOME_UNSET_VAR" ] && echo true || echo false
false
probado con bash 3.00.16 (1) y 4.1.5 (1)
rm -rf $ARTIFACTS
sin el/*
. Esto también eliminaría el$ARTIFACTS
directorio, lo cual está bien, porque si quiero estar seguro de que existe antes de poner algo en él, lo ejecutaré demkdir -p $ARTIFACTS
todos modos. También eliminará los archivos ocultos dentro$ARTIFACTS
, lo cual también está bien, porque no escribiríarm -rf $ARTIFACTS/*
si$ARTIFACTS
contuviera algo que quisiera guardar.