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

Я запустил 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, работает нормально.

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

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

1 ответ

Решение

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

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

Объяснение:

Причина Баш говорит : 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 чтобы увидеть это более четко.

Другие вопросы по тегам