Когда bash расширяет $dir
, он выполняет только разбиение и разбрасывание слов. Разделение слов дает три слова: cd
, "/cygdrive/c/Program
and Files/"
. Тогда команда для выполнения - это cd
с двумя аргументами; cd
смотрит только на свой первый аргумент "/cygdrive/c/Program
, который не является существующим каталогом.
Если вы хотите выполнить полную оценку оболочки для содержимого переменной, используйте eval
:
eval "$dir"
Обратите внимание, что вам нужны двойные кавычки вокруг $dir
, иначе сначала будет выполнено разбиение по словам , а затем eval
объединит свои аргументы с пробелами. Это может сработать, но в целом будет плохо (например, если в имени файла будет два последовательных пробела).
Однако строка не является правильным способом для хранения команды оболочки, которую вы хотите выполнить. Если у вас нет необычного требования, вы должны использовать вместо этого функцию:
dir () {
cd "/cygdrive/c/Program Files/"
}
Если вы действительно заинтересованы в наборе $dir
для переключения на конкретный каталог, и это не просто пример, начиная с bash 4, поместите shopt -s autocd
в ваш .bashrc
и установите
dir="/cygdrive/c/Program Files/"
после чего вы можете просто ввести "/cygdrive/c/Program Files/"
или "$dir"
в командной строке, чтобы переключиться на этот каталог. Вам все еще нужны двойные кавычки около $dir
; если вам это не нравится, используйте zsh вместо bash.