Windows 10 Ubuntu Bash: псевдонимы не работают (: команда не найдена)

4707
kleinfreund

Я запустил Ubuntu Bash в Windows, который был поставлен с Anniversary Update 1607. Этот Bash содержит .bashrcфайл, в /home/philкотором находится домашний каталог пользователя Unix, а не пользователя Windows (это будет /mnt/c/Users/Philipp). В этом файле среди прочего есть следующий кусок кода:

if [ -f .bash_aliases ]; then . .bash_aliases fi 

Поскольку у меня уже есть файл псевдонимов в моем домашнем каталоге Windows, я заменил этот фрагмент на:

if [ -f /mnt/c/Users/Philipp/.aliases_win ]; then . /mnt/c/Users/Philipp/.aliases_win fi 

Который при перезапуске bash или sourcing напрямую source /mnt/c/Users/Philipp/.aliases_winдает:

: command not found : command not found : command not found : command not found : command not found : command not found : command not found 

Поэтому я удалил столько псевдонимов, пока не исчезли эти сообщения об ошибках, оставив в файле только эти псевдонимы:

(Для справки полный файл выглядит следующим образом: https://github.com/kleinfreund/dotfiles/blob/master/win/bash/.aliases )

# Quickly navigate up the *great hollow* alias ..='cd ..' alias ...='cd ../..' alias ....='cd ../../..' alias .....='cd ../../../..' 

Но при использовании:

phil@RAUMSTATION:~$ .. : File or directory not found 

Однако, когда я делаю alias ..='cd ..'прямо изнутри bash, он работает нормально.

Я сейчас совершенно сбит с толку. Что я делаю неправильно? Файл псевдонимов прекрасно работает на моей установке Ubuntu, а также с такими вещами, как Git Bash.

Изменить: Положив мои псевдонимы в /home/phil/.bashrcработах, не так много, при поиске файла из домашнего каталога моих пользователей Windows.

1

1 ответ на вопрос

3
Josh Brobst

Вам необходимо преобразовать окончания строк /mnt/c/Users/Philipp/.aliases_winиз формата Windows (CRLF) в формат Unix (LF). Вы можете сделать это с помощью sed (это перезапишет файл):

sed -i 's/\r$//' /mnt/c/Users/Philipp/.aliases_win 

Объяснение:

Причина, по которой bash говорит, : command not foundзаключается в том, что она интерпретирует возврат каретки на «пустых» строках в файле в формате Windows как имя команды. Вы можете проверить это сами в оболочке bash, набрав CTRL-V, CTRL-M и нажав Enter (CTRL-M или ^ M соответствует возврату каретки, см. man console_codes).

После того, как вы удалили все пустые строки, у вас остались всего несколько команд псевдонимов, которые вы получили : File or directory not foundпосле выполнения псевдонимов, потому что возврат каретки в конце строк псевдонимов был фактически добавлен в псевдоним. Например, линия alias ..='cd ..'<CR><LF>сделал ..псевдоним cd ..<CR>, который не идет в родительскую папку, ..но вместо этого пытается перейти в каталог с именем ..<CR>. Сообщение об ошибке при запуске этого псевдонима не начинается с типичного, bash: cd: foldernameпотому что повторение возврата каретки в имени папки приводит к тому, что курсор возвращается в начало строки; попробуйте что-то вроде, echo aaaa<CR>bbчтобы увидеть это более четко.