Bog*_*Biv 3 command-line bash bashrc
尝试了以下shebang行:
$ head -n2 .bashrc | od -c
0000000 357 273 277 # ! / b i n / b a s h \n
$ bash
bash: #!/bin/bash: No such file or directory
Run Code Online (Sandbox Code Playgroud)
.bashrc中开始与空行所谓(前三个字符是看不见的):
$ head -n2 .bashrc | od -c
0000000 357 273 277 \n # ! / b i n / b a s h \n
$ bash:
: command not found
Run Code Online (Sandbox Code Playgroud)
在该行之后 bashrc 行正常执行,因此功能不受影响。但是我发现这个错误很烦人。
我希望这篇文章对某人有所帮助。
您的文件不是以 开头#!/bin/bash
,而是以三字节序列 357 273 277 开头(其中每个字节都以八进制输入;这是更常见的十六进制中的 ef bb bf)是 Unicode 字符 U 的 UTF-8 编码+FEFF 零宽度不间断空间。请注意字符结尾(字符或字符序列与字节序列之间的对应关系,例如 UTF-8)和字符集(字符与其表示之间的对应关系,例如 Unicode)之间的区别,因为这在这里很重要。
字符 U+FEFF 也称为字节顺序标记 (BOM)。此字符用于以UTF-16编码的文本文件的开头。UTF-16 使用基于两个字节单位的表示,每个单位内的字节可以是以下任一顺序:大端或小端(它只需要在一个文本文件中保持一致)。BOM 字符用于指示以 UTF-16 编码的文件的字节序(对称字符 U+FFFE 有意未分配,因此前两个字节只能在两种可能的字节序之一中有效)。
U+FEFF 的 BOM 解释仅在具有字节顺序的编码中有意义,例如 UTF-16。UTF-8 编码没有字节顺序的概念,因为字符以(可变大小)字节序列编码,并具有明确定义的顺序。因此,在 UTF-8 中,字节序列 ef bb bf 只是字符 U+FEFF,它只是另一个非 ASCII Unicode 字符。
与许多其他程序一样,Bash 将所有非ASCII字符视为可以出现在字符串中的普通字符。对于 bash,字符串包括裸词。这样做的优点是 bash 可以处理任何编码的输入,只要该编码是 ASCII 的超集,即 ASCII 集中的字符被编码为一个字节,带有它们的 ASCII 编码值。UTF-8 就是这样一种编码。U+FEFF 是一个零宽度空间,因此对人类不可见,但对程序可见。以 Unicode 解释其输入的程序可能会将其视为空白字符,但将其输入解释为 ASCII 加上无意义的非 ASCII 字符的程序则不会。
在您的文件中,bash 看到它解析为普通字符的 14 个字节的初始序列:ef bb bf 23 21 2f 62 69 6e 2f 62 61 73 68。前三个以 UTF-8 编码对 U+FEFF 进行编码;bash 的解析器不关心编码并将它们视为三个普通字符。第四个字符#
不是注释开始字符,因为它不在单词的开头。生成的 14 个字符的单词被解释为命令名称,并且没有该名称的命令。
与大多数其他程序文本一样,Shell 脚本必须以与 ASCII 兼容的编码编写。确保您的编辑器没有在换行符之前添加诸如回车符(行尾的 Windows 编码,但 Unix 程序将回车符视为普通字符)或 U+FEFF 开头的虚假字符。无论如何,U+FEFF 是一个字节顺序标记,仅位于以 UTF-16 编码的文件的开头;当它用在以 UTF-8 编码的文件的开头时,它只是开头的一个无用空间。如果编辑器在 UTF-8 文件的开头添加 U+FEFF,那就是一个错误。
除此之外,shebang 行在.bashrc
. 虽然它不会造成任何伤害(这里的伤害是因为您实际上没有有效的 shebang 行),但它是虚假的并且可能令人困惑。该文件永远不会作为独立脚本执行。
归档时间: |
|
查看次数: |
1385 次 |
最近记录: |