发现问题了么?上面的代码块root路径都是以斜杠(/)分隔的,下面的代码块的root路径却是以反斜杠(\)分隔的。两种不同的方式却能同样生效,这个是为什么呢?
作为路径分隔符在windows和Unix系统下的区别
在上文中的例子,不论是正斜杠还是反斜杠(\),都是作为路径分隔符存在的,因此我们首先把他们作为路径分隔符,分别在windows和Unix两种不同内核的系统下进行一波测试。
windows(win764位系统)下:
Unix(Ubuntu14.04.5)下:
可以看出,Unix内核系统,路径格式仅支持正斜杠(/)分隔,而windows的系统,正斜杠(/)反斜杠(\)都支持,这是个很奇妙的差别。
在查询了资料后,我才知道造成这种差别的深层次原因。
windows的命令行(CMD应用程序)跟早期的MS-DOS操作系统的命令格式是前向兼容的。而DOS系统其实有很多历史遗留问题。
DOS系统很大一部分参考(抄袭?)自加里·基尔代尔的更早的一款操作系统CP/M。
CP/M是数字研究公司(1991年被Novell所兼并)在1974年开发,为8位CPU(如Intel8080、ZilogZ80等)的个人电脑(PC)所设计的操作系统。在PC市场的黎明阶段,它成为被广泛应用的操作系统。可是因为在向16位CPU的转化上错失机会,在以IBMPC/AT以及IBMPC兼容机为中心的16位PC市场上惨败给Microsoft的MS-DOS,从而从市场上消失。虽然CP/M推出了为Intel8086而设计的“CP/M86”以及为Motorola68000而设计的“CP/M68k”等版本,但用户几乎不存在。
由于CP/M系统是不支持目录的,/被拿来用作命令行参数的标识符,比如说dir/a,dir/w,dir/q等等(Unix用的是”-“),因此,当MS-DOS系统准备支持目录时,/已被占用,只能使用\来表示路径分隔符了。再后来,windows系统诞生之时,命令行因为要跟MS-DOS兼容,只能把DOS的特性沿用了下来,同时又给支持/作为路径分隔符,于是就造成了现在这种正斜杠(/)反斜杠(\)都支持作为路径分隔符的情况的出现。而Unix不存在这种历史遗留问题,从诞生之初就开始使用斜杠(/)作为路径分隔符,因此,两个系统在这种奇怪的地方出现了分叉。
而我当时的那段代码
1
2
3
location/{
rootF:\webapp\portal;
}
中的root路径,是直接从windows系统中粘贴的路径,因此就会出现这种反斜杠(\)做分隔符的奇怪场景。
对了,在测试过程中还发现了windows系统中使用/和\做分隔符的一个好玩的区别:
因此,仅在windows下做目录操作时,还是使用反斜杠(\)做分隔符系统支持度更强些,使用体验也更好一些。
广义方面的区别
正斜杠(/)
正斜杠(/)也可以用作“除法”或者“分号”的作用,比如说”100÷4”我们在计算机上输入时,由于除号比较难输,经常就会写成”100/4”,效果是完全一致的。这种用法应该是从“分号”演化来的,毕竟”4/3”你看做“三分之四”还是看做“4除以3”,都是可以的。
连续两个正斜杠(/)可做“注释”之用,在C++/C#/Java/JavaScript/PHP等主流编程语言中基本上通用:
日期也可以使用正斜杠(/)分隔年月日,例如”2017/11/17”,也可以用美国标准”11/17/2017”,都表示2017年11月17日。
最后,斜线除了上述用法,也成为连字号的代替品。例如美国空军的飞机序号。”85-1000”是第1000架飞机在1985年制造,使用斜线”85-1001/1050”表示首批连串50部制造的飞机。
//在控制台打印helloworld!
console.log('helloworld!')
反斜杠(\)
比起正斜杠(/)的诸多用处,反斜杠(\)的用处可就少多了。如果你还是动不动就用到反斜杠(\),证明你肯定是一个程序员。
反斜杠(\)除了可以在windows下可以做路径分隔符外,最常用的功能就是做转义字符了。许多正则表达式语言都会将它视为字面意义和元字符之前的切换。例如\n是换行,\0是空字符,它们表示的实际上都是一个字符(char);而在一些数学软件(如MATLAB)和维基百科上,可以使用反斜线输入希腊字母。\pi会转成π,\lambda会转成λ。由于反斜杠(\)存在转义字符的作用,因此我们常常在一些代码里面看到形如”C:\\Windows\\System32\\cmd.exe”的路径格式(实际上你看到的双反斜杠(\),我在markdown格式下输入了连续4个反斜杠…),并不代表实际路径是这样的,而是其中连续两个反斜杠(\)发生了“化学反应”,第一个反斜杠(\)代表对后面部分进行转义,而对反斜杠(\)的转义还是反斜杠(\),因此虽然连续输入两个反斜杠(\),但是实际输出时只有一个反斜杠(\)。
另外,在某些程序语言的命令行中,例如在linux中,反斜线常被放在一行的末尾用来指示编译器忽略其后的换行符,使得下一行会被当做同一行语句。这种情况下,反斜线作为一个强制换行符,将代码拆解成“连续行”。
小结
TIPS
看了这么一大堆正斜杠(/)和反斜杠(\),是不是头都大了呢?没关系,要想记忆区分正斜杠(/)反斜杠(\),可以把他们想象为笔画上的撇(丿)和捺(),一撇一捺是为八,第一笔正斜,第二笔反斜(/\),这样是不是好记多了呢?
文自:拓跋的前端客栈
如涉及侵权请联系我们马上处理
·END·
——面试求职|每日一荐——
梁胜博士写给程序员的话
程我的个人职业发展心路历程及对程序员职业生涯规划的建议
本文为RancherLabsCEO兼创始人梁胜博士应InfoQ之邀,为广大程序员专门撰写的个人职业发展心路历程及对程序员职业生涯规划的建议。
梁胜博士是RancherLabsInc.公司联合创始人及CEO。创立RancherLabs之前,早期在全球知名的他SunMicrosystems公司担任核心主任级工程师期间,梁胜博士是Java语言J2SE平台核心组件JNI(JavaNativeInterface)的作者,并随后领导设计和开发了Java语言最为核心的JVM(Java虚拟机)。
......
(查看全文,请订阅号内对话框回复:梁)
文自:InfoQ-梁胜编辑:谢然感谢作者让我们了解更多!谢谢!