Bash别名文件已损坏:没有此类文件或目录

时间:2014-09-02 17:29:11

标签: bash newline alias dos2unix

我有/ ~/.bashrc_aliases.sh(包含bash别名的文件)来自我的~/.bashrc文件。这个~/.bashrc_aliases.sh文件碰巧是DOS格式,我通过在文件上运行dos2unix来修复。

当此别名文件采用“DOS”格式时,每当我在Bash中键入alias命令时,alias行都以'字符而不是{{1}开头并且别名不会真正起作用,所以我得到了类似的东西:

  

“:没有这样的文件或目录”,“s:无效选项 - '”

文件处于DOS格式时发生了什么?为什么a命令返回以alias字符开头的行?为什么我收到上述错误?


  

被kenorb标记为重复,tripleee bash

     

之前已经问过这个问题并且已经有了答案。如果这些答案没有完全解决您的问题,请编辑此问题以解释它的不同之处或提出新问题。

与之相关的问题是如何解决问题。虽然这个问题要求解释问题中发生了什么,而不是如何解决它。

2 个答案:

答案 0 :(得分:3)

第一部分更容易回答。 DOS换行符“character”是一对\r\n(回车,换行)。 bash将回车符解释为另一个字符,因此它会附加到别名的末尾。例如

alias foo='echo foo'

会在别名的主体后附加一个尾随\r。当由alias命令显示时,该回车会在打印最终'之前将光标移动到行的开头(这将覆盖a中的alias) 。也就是说,而不是

$ alias
alias foo='echo foo'
你有

$ alias
'lias foo'=echo foo

错误可能完全取决于您定义的别名,但在每种情况下,尾随回车以相同的方式影响错误消息;光标移动到行的开头,并导致消息的结尾覆盖开头。

答案 1 :(得分:1)

终端将\r解释为“转到当前行的开头,(并开始覆盖那里的字符)”

大多数终端将\n解释为“同一列中的一行”,但在termios中有一个(通常在线)配置位,可将\n转换为{{1} }}

(C1控件\r\nIND = '\x84'也是明确的,但没有人使用它们。