是无效的 Bash 别名

TTT*_*TTT 3 unicode bash

在 Mac OS X 上,我向我的.bash_profile. 首先我使用了 ,但由于它是一个构建命令,我发现更合适。

我尝试过这些:

alias ='echo "build with fun."'
alias ='echo "build with tools."'
alias ='echo "build with style."'
Run Code Online (Sandbox Code Playgroud)

奇怪的是,这不是一个有效的别名,正如 bash 报告的那样:

-bash: alias: `': invalid alias name
Run Code Online (Sandbox Code Playgroud)

这是为什么..?

Jos*_*Lee 5

由于某种原因,shell 希望引用该名称,因此相应地不允许将其作为别名。General.c:legal_alias_name()

\n\n

即使locale所有值都输出“en_US.UTF-8”也是如此。

\n\n

尝试不同的表情符号:

\n\n
~$ alias =\'echo oh bother\'\n~$ \noh bother\n~$ alias =\'echo build\'\nbash: alias: `\': invalid alias name\n--> 1\n
Run Code Online (Sandbox Code Playgroud)\n\n

为什么 shell 要引用这个名字?我的第一个猜测是 是来自 Unicode 7.0 而是来自 Unicode 6.0,我用 的行为ls来说服自己:

\n\n
~$ touch  \n~$ ls -b  \n                \\360\\237\\233\\240\n
Run Code Online (Sandbox Code Playgroud)\n\n

由于我可以在 Linux 上使用别名,但不能在 macOS 上使用,所以这看起来特别好,因为 macOS 附带了旧版本的 bash \xe2\x80\x94,即使我已经使用自制程序安装了最新版本。

\n\n

为了测试这个理论,我也尝试了 Unicode 6.0:

\n\n
$ alias ,=\'echo choo choo\'\nbash: alias: `,\': invalid alias name\n--> 1\n
Run Code Online (Sandbox Code Playgroud)\n\n

所以不是这样的!Linux 上的 bash 很乐意使用所有这些字符作为别名。(并且 的行为ls是一种转移注意力的行为,因为它会将 (7.0) 打印为 utf-8,但 Mac 上的 bash 会接受它作为别名。)

\n\n

但别名函数似乎将字符串视为bytes,而不是字符,并且这两个失败都以 结尾0xA0,我知道这是 Latin-1 中的“不间断空格”。如果不跳入所有 C 宏声明,我敢打赌该字符会受到怀疑。

\n\n
Mac$ alias $\'\\u00a0\'=foo \nbash: alias: `\xc2\xa0\': invalid alias name\n--> 1\nLinux$ alias $\'\\u00a0\'=foo\nLinux$ $\'\\u00a0\'\n\xc2\xa0: command not found\n--> 127\n
Run Code Online (Sandbox Code Playgroud)\n\n

显然,选择一个 UTF-8 编码不包含字节的字符A0。但我不知道为什么这个检查在我的 Linux 机器上被忽略。

\n