今天在檢查root目錄時發現有一個名為“\”的檔案,覺得很奇怪,從來沒見過,就準備用Vim打開看看,很自然地輸入指令檢視一下,結果居然打不開。
<code> </code>
<code>[root@localhost ~]# ll</code>
<code>總用量 48</code>
<code>-rw-r--r--. 1 root root 0 7月 9 2015 \</code>
<code>-rw-------. 1 root root 1414 6月 30 22:51 anaconda-ks.cfg</code>
<code>-rw-r--r--. 1 root root 30147 6月 30 22:51 install.log</code>
<code>-rw-r--r--. 1 root root 7800 6月 30 22:50 install.log.syslog</code>
<code>[root@localhost ~]# vim \</code>
<code>> </code>
稍微思考了一下就明白了,不是打不開,問題出在這個檔案名“ \ ”上面。
反斜線符号“ \ ”在Bash中被解釋為轉義字元,用于去除一個單個字元的特殊意義,它保留了跟随在之後的字元的字面值,除了換行符。如果在反斜線之後一個換行字元立即出現,轉義字元使行得以繼續,遇到指令很長時使用反斜線很有效;反斜線從輸入流中被移除并有效地忽略。
例一:
<code>[root@localhost ~]# echo $HOME</code>
<code>/root</code>
<code>[root@localhost ~]# echo \$HOME</code>
<code>$HOME</code>
例子中,反斜線去除了“ $ ”字元的特殊意義,保留字面值,進而不輸出home目錄路徑。
例二:
<code>[root@localhost ~]# mv test.c \</code>
<code>> ..</code>
<code>mv: 無法擷取"test.c" 的檔案狀态(stat): 沒有那個檔案或目錄</code>
例子中,反斜線使行得以繼續,指令可以正常輸入。
到這裡就明白了怎麼檢視檔案名為“ \ ”的文檔了,隻要輸入指令
這個問題解決了,但是又想到了與反斜線對應的,也是經常用到一個符号:正斜線(“ / ”),再來看看這兩個符号的差別。
在知乎上看到這麼個說法:反斜線“\”是電腦出現了之後為了表示程式設計裡的特殊含義才發明的專用标點。就是說,除了程式設計領域外,任何地方都不應該有使用反斜杠的時候,請永遠使用正斜線“/”。
粗略想想還真差不多是這麼回事,但是馬上就想到一朵奇葩:Windows系統中用反斜線“\”來表示目錄,但是Linux下用正斜線“/”來表示。估計不少人剛從Windows轉到Linux下時都犯過這種錯。
Windows: “/”是表示參數,“\”是表示本地路徑。 Linux和Unix: “/”表示路徑,“\”表示轉義,“-”和“--”表示參數。 網絡: 由于網絡使用Unix标準,是以網絡路徑用“/”。
但是為什麼Windows要用" / ",難道隻是為了顯示和Linux的不同嗎?顯然不是的,裡面曆史原因很複雜 ,同樣在知乎找到了答案。
Windows 用反斜杠(“\”)的曆史來自 DOS,而 DOS 的另一個傳統是用斜杠(“/”)表示指令行參數,比如: cd %SystemDrive% dir /s /b shell32.dll 既然 DOS 這邊斜杠被占用了,隻好找一個最接近的。那就是它了。而在 UNIX 環境中,我們用減号(“-”)和雙減号(“--”)表示指令行參數。 用斜杠表示指令行參數是相容性原因。這個問題最初起源自 IBM。IBM 在最初加入 DOS 開發時貢獻了大批工具,它們都是用斜杠處理指令行參數的。而這個傳統源自于 DEC/IBM,比如當年的 VMS 就是用斜杠處理指令行參數,它的目錄分隔符是美元符(“$”)。順便說一句,這個傳統也被部分地繼承進了 DOS 和 Windows 體系,日文版的 Windows 就把反斜杠在螢幕上顯示為“¥”,雖然實際上還是反斜杠。 如今的 Windows 核心在處理路徑時确實可以同時支援斜杠和反斜杠。很多時候我們看到用斜杠時出錯,是因為應用程式層面的原因。比如 cmd.exe 就不支援用斜杠表示路徑,而PowerShell.exe 支援,也正因為這個原因,PowerShell 開始轉而使用減号作為指令行參數的起始符。 MSDN上有一篇 blog 說得很清楚: