Когда 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.