Lorsque bash se développe $dir
, il n'effectue que la division et la globalisation des mots. Fractionnement mot produit trois mots: cd
, "/cygdrive/c/Program
et Files/"
. Ensuite, la commande à exécuter est cd
avec deux arguments; cd
ne regarde que son premier argument "/cygdrive/c/Program
, qui n'est pas un répertoire existant.
Si vous souhaitez effectuer une évaluation complète du shell sur le contenu d'une variable, utilisez eval
:
eval "$dir"
Notez que vous avez besoin des guillemets doubles $dir
, sinon le fractionnement de mots serait d'abord effectué, puis eval
concaténerait ses arguments avec des espaces. Cela se produirait ici, mais irait mal en général (par exemple, s'il y avait deux espaces consécutifs dans un nom de fichier).
Cependant, une chaîne n'est pas le bon moyen de stocker une commande shell que vous souhaitez exécuter. Sauf si vous avez une exigence inhabituelle, vous devez plutôt utiliser une fonction:
dir () {
cd "/cygdrive/c/Program Files/"
}
Si vous êtes vraiment intéressé à taper $dir
pour basculer vers un répertoire particulier et ce n'est pas seulement un exemple simple, depuis bash 4, mettez shopt -s autocd
votre .bashrc
et définissez
dir="/cygdrive/c/Program Files/"
après quoi vous pouvez taper juste "/cygdrive/c/Program Files/"
ou "$dir"
à l'invite du shell pour basculer vers ce répertoire. Vous avez toujours besoin des guillemets $dir
; si vous n'aimez pas cela, utilisez zsh au lieu de bash.