Windows 10 Ubuntu Bash:别名不起作用(:未找到命令)

Windows 10 Ubuntu Bash:别名不起作用(:未找到命令)

我在 Windows 上启动了 Ubuntu bash,它随 Anniversary Update 1607 一起提供。此 bash 源文件.bashrc位于/home/philUnix 用户的主目录,而不是 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 或直接使用 sourcesource /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

您需要将行尾/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 shell 中输入 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可以更清楚地看到这一点。

相关内容