Kiedy bash się rozwija $dir
, wykonuje tylko dzielenie i globowanie słów. Rozszczepienie słowo produkuje trzy słowa: cd
, "/cygdrive/c/Program
i Files/"
. Następnie polecenie wykonania ma cd
dwa argumenty; cd
patrzy tylko na pierwszy argument "/cygdrive/c/Program
, który nie jest istniejącym katalogiem.
Jeśli chcesz przeprowadzić pełną ocenę powłoki dla zawartości zmiennej, użyj eval
:
eval "$dir"
Zauważ, że potrzebujesz podwójnych cudzysłowów $dir
, w przeciwnym razie najpierw zostanie wykonane dzielenie słów, a następnie eval
połączy swoje argumenty spacjami. To by się działało tutaj, ale ogólnie byłoby źle (np. Gdyby w nazwie pliku były dwie kolejne spacje).
Jednak ciąg znaków nie jest właściwym sposobem przechowywania polecenia powłoki, które chcesz wykonać. Jeśli nie masz nietypowych wymagań, zamiast tego powinieneś użyć funkcji:
dir () {
cd "/cygdrive/c/Program Files/"
}
Jeśli jesteś naprawdę zainteresowany w typowania $dir
do przełącznika do określonego katalogu i nie jest to tylko prosty przykład, ponieważ bash 4, umieścić shopt -s autocd
w swoim .bashrc
i ustawić
dir="/cygdrive/c/Program Files/"
po czym możesz wpisać just "/cygdrive/c/Program Files/"
lub "$dir"
w wierszu poleceń powłoki, aby przejść do tego katalogu. Nadal potrzebujesz podwójnych cudzysłowów $dir
; jeśli ci się to nie podoba, użyj zsh zamiast bash.