2010-04-30 24 views
10

El siguiente es un fragmento de un script bash que estoy corriendo bajo Cygwin en Windows:mkdir error en la escritura del golpe

deployDir=/cygdrive/c/Temp/deploy 

timestamp=`date +%Y-%m-%d_%H:%M:%S` 
deployDir=${deployDir}/$timestamp 

if [ ! -d "$deployDir" ]; then 
    echo "making dir $deployDir" 
    mkdir -p $deployDir 
fi 

Esto produce una salida como:

making dir /cygdrive/c/Temp/deploy/2010-04-30_11:47:58 
mkdir: missing operand 
Try `mkdir --help' for more information. 

Sin embargo, si Escribo /cygdrive/c/Temp/deploy/2010-04-30_11:47:58 en la línea de comandos que tiene éxito, ¿por qué el mismo comando no funciona en el script?

Gracias, Don

Respuesta

24

Cambio:

mkdir -p $deploydir 

a

mkdir -p "$deployDir" 

Al igual que la mayoría de los cartuchos de Unix (tal vez incluso todos), Bourne (Again) Shell (sh/bash) distingue entre mayúsculas y minúsculas. El dir var se llama deployDir (mixed-case) en todas partes excepto en el comando mkdir, donde se llama deploydir (todo en minúsculas). Como deploydir (todas minúsculas) es una variable distinta considerada de deployDir (caso mixto) y deplydir (todas minúsculas) nunca ha tenido un valor asignado, el valor de deploydir (todas minúsculas) es una cadena vacía ("").

Sin las comillas (mkdir $deploydir), la línea efectivamente se convierte en mkdir (solo el comando sin el operando requerido), por lo tanto el error mkdir: missing operand.

Con las comillas (mkdir "$deploydir"), la línea se convierte efectivamente en mkdir "" (el comando para hacer un directorio con el nombre del directorio ilegal de cadena vacía), por lo tanto el error mkdir: cannot create directory'.

Se recomienda utilizar el formulario con comillas (mkdir "$deployDir") en caso de que el nombre del directorio de destino incluya espacios.

8

Cambio:

mkdir -p $deploydir 

a

mkdir -p "$deploydir" 
1

No puede haber dos puntos en los nombres de archivo en Windows, por razones obvias.

+0

Eso es cierto. Pero, ¿quién dijo algo acerca de Windows? –

+0

@Dennis: ¿La pregunta? "[...] corriendo bajo cygwin en Windows"? – unwind

+0

Oops, regreso a la guardería para mí. Sin embargo, Cygwin admite dos puntos en los nombres de archivo. –

Cuestiones relacionadas