Когда bash расширяется $dir, он выполняет только разбиение по словам и сглаживание. Слово расщепление производит три слова: cd, "/cygdrive/c/Programи 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.