Busqué en Google esto, pero no puedo entender por qué Bash se queja con el siguiente código para verificar si existe un directorio:
test.mk
#!/bin/bash
MYDIR="dl"
all:
if [ ! -d $MYDIR ]; then
#if [ ! -d "${MYDIR}" ]; then
#if [ ! -d ${MYDIR} ]; then
#Here
fi
make -f test.mk
if [ ! -d YDIR ]; then
/bin/sh: Syntax error: end of file unexpected
make: *** [all] Error 2
¿Alguien sabe por qué falla? ¿Y por qué llama a / bin / sh en lugar de / bin / bash? Gracias.
Editar: a diferencia de Bash, make no admite bloque de varias líneas. Aquí está el código de trabajo:
MYDIR="dl"
all:
if [ ! -d ${MYDIR} ]; then
echo "Here";
else
echo "There";
fi
Respuestas
4 para la respuesta № 1los #!/bin/bash
El shebang que insertó en la parte superior es inútil y es tratado por make
como un comentario
make
envía por defecto comandos a /bin/sh
. Para especificar un shell diferente, use la macro SHELL = /bin/bash
.
Además, necesita escapar de su variable:
if [ ! -d ${MYDIR} ]
No estoy seguro si make
puede manejar declaraciones de varias líneas, así que intente poner todas las if
bloque en una línea.
if [ ! -d ${MYDIR} ]; then DO_SOMETHING; DO_SOMETHING_ELSE; fi
3 para la respuesta № 2
Te estas alimentando test.mk
a make
, No a bash
. Entonces make
envía líneas individuales al shell, no bloques enteros.
make
usa su SHELL
macro para determinar qué shell usar. Puedes anularlo para que se use bash
.
La razón por la que estás recibiendo YDIR
es eso make
tiene reglas tontas sobre la interpolación variable. Escribir $(MYDIR)
no $MYDIR
.
0 para la respuesta № 3
Intenta apuntalar tu variable:
${MYDIR}