bash 反斜线的一个疑问

ABS 里在讲解 echo 的转义时,给出过下面这几个例子:

bash-4.2$ echo \z
z
bash-4.2$ echo \z
z
bash-4.2$ echo echo \z
z
bash-4.2$ echo echo \z
z

我们知道反引号会把里面命令的输出直接传递给外面的命令,那么,既然前两个echo的输出一样,为什么后面就不一样呢?这里一定发生了什么我们没有注意到。我来根据我的理解来解释一下。

从第一个开始看,”\z”中的第一个反斜线表示转义后面的那个反斜线,所以输出””,”z”直接输出,最后得到“z”。

第二个也不难,”\z”中前两个反斜线同样输出””,后面剩下”z”,因为 echo 默认不解释转义,所以就算是”z”有特殊含义也不会被解释,因此”z”中的””会把”z”的特殊含义(本身就没有)去掉,然后输出”z”,最后得到”z”。

从第三个开始就复杂了。因为有了 subshell,所以里面的反斜线一定被处理过两次:一次是 subshell 中,另一次是外面的 shell。外面的shell开始处理,”\”同样被处理成””,处理完成后得到:echo echo z;然后 subshell 开始执行里面的”echo z”,处理””然后输出z,最后外面的shell 看到的是 echo z,输出”z”,结束。

第四个更复杂一些,外面的shell处理反斜线后得到:echo echo \z,前两个”\”依旧被解释成””,剩下的”z”会原封不动,因为”z”对于外面的shell来说没兴趣,它只对”`”或”$”这样的转义感兴趣!subshell 执行“echo \z”,同第一个例子,输出z,这时外面的shell看到的是echo z,输出”z”,结束。

例子虽简单,却能反映出我们确实对 bash 还有一些角落的地方没有理解清楚。理解 ABS 后面的例子就留给你作为课后作业了。:-)