Quando bash si espande $dir, esegue solo la suddivisione delle parole e il globbing su di esso. La suddivisione in parole produce tre parole: cd, "/cygdrive/c/Programe Files/". Quindi il comando da eseguire è cdcon due argomenti; cdesamina solo il suo primo argomento "/cygdrive/c/Program, che non è una directory esistente.
Se si desidera eseguire una valutazione completa della shell sul contenuto di una variabile, utilizzare eval:
eval "$dir"
Nota che hai bisogno delle doppie virgolette $dir, altrimenti la divisione delle parole verrebbe prima eseguita, quindi evalconcatenerebbe i suoi argomenti con gli spazi. Questo accadrà qui, ma andrebbe male in generale (ad esempio se ci fossero due spazi consecutivi in un nome di file).
Tuttavia, una stringa non è il modo giusto per archiviare un comando shell che si desidera eseguire. A meno che tu non abbia un requisito insolito, dovresti invece utilizzare una funzione:
dir () {
cd "/cygdrive/c/Program Files/"
}
Se sei davvero interessato a digitare $dirper passare a una directory specifica e questo non è solo un semplice esempio, poiché bash 4, inserisci il shopt -s autocdtuo .bashrce imposta
dir="/cygdrive/c/Program Files/"
dopodiché puoi digitare solo "/cygdrive/c/Program Files/"o "$dir"al prompt della shell per passare a quella directory. Hai ancora bisogno delle doppie virgolette in giro $dir; se non ti piace, usa zsh invece di bash.