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/Program
e Files/"
. Quindi il comando da eseguire è cd
con due argomenti; cd
esamina 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 eval
concatenerebbe 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 $dir
per passare a una directory specifica e questo non è solo un semplice esempio, poiché bash 4, inserisci il shopt -s autocd
tuo .bashrc
e 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.