1

Я запустил 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

Вам необходимо преобразовать окончания /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 чтобы увидеть это более четко.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .