2010-04-30 6 views
10

Ce qui suit est un fragment d'un script bash que je suis en cours d'exécution sous Cygwin sur Windows:mkdir erreur dans le script bash

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 

Ce produit sortie tels que:

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

Cependant, si Je tape /cygdrive/c/Temp/deploy/2010-04-30_11:47:58 sur la ligne de commande, il réussit, pourquoi la même commande ne fonctionne pas dans le script?

Merci, Don

Répondre

24

Change:

mkdir -p $deploydir 

à

mkdir -p "$deployDir" 

Comme la plupart des shells Unix (peut-être même tous), Bourne (Again) Shell (sh/bash) est sensible à la casse. Le répertoire var est appelé deployDir (casse) partout sauf pour la commande mkdir, où elle est appelée deploydir (tout en minuscules). Puisque deploydir (tout en minuscules) est une variable distincte considérée de deployDir (mixte) et deplydir (toute minuscule) n'a jamais reçu de valeur, la valeur de deploydir (tout en minuscules) est une chaîne vide ("").

Sans les guillemets (mkdir $deploydir), la ligne devient effectivement mkdir (juste la commande sans l'opérande requis), donc l'erreur mkdir: missing operand.

Avec les guillemets (mkdir "$deploydir"), la ligne devient effectivement mkdir "" (la commande pour faire un répertoire avec le nom du répertoire illégal de chaîne vide), donc l'erreur mkdir: cannot create directory ». Il est recommandé d'utiliser le formulaire avec des guillemets (mkdir "$deployDir") si le nom du répertoire cible inclut des espaces.

8

Change:

mkdir -p $deploydir 

à

mkdir -p "$deploydir" 
1

Vous ne pouvez pas avoir des deux-points dans les noms de fichiers sous Windows, pour des raisons évidentes.

+0

C'est vrai. Mais qui a dit quelque chose à propos de Windows? –

+0

@Dennis: La question? "[...] fonctionnant sous cygwin sur Windows"? – unwind

+0

Oups, retour à l'école maternelle pour moi. Cependant, Cygwin prend en charge les deux-points dans les noms de fichiers. –