Kiedy bash się rozwija $dir, wykonuje tylko dzielenie i globowanie słów. Rozszczepienie słowo produkuje trzy słowa: cd, "/cygdrive/c/Programi Files/". Następnie polecenie wykonania ma cddwa argumenty; cdpatrzy 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 evalpołą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 $dirdo przełącznika do określonego katalogu i nie jest to tylko prosty przykład, ponieważ bash 4, umieścić shopt -s autocdw swoim .bashrci 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.