今天在檢查home目錄時發現有一個名為“\”的文件,覺得很奇怪,從來沒見過,就准備用Vim打開看看,很自然地輸入命令查看一下,結果居然打不開。
ubuntu@ubuntu:~$ vi \
>
ubuntu@ubuntu:~$
稍微思考了一下就明白了,不是打不開,問題出在這個文件名“ \ ”上面。
反斜線符號“ \ ”在Bash中被解釋為轉義字符,用於去除一個單個字符的特殊意義,它保留了跟隨在之后的字符的字面值,除了換行符。如果在反斜線之后一個換行字符立即出現,轉義字符使行得以繼續,遇到命令很長時使用反斜線很有效;反斜線從輸入流中被移除並有效地忽略。
例一:
ubuntu@ubuntu:~$ echo $HOME
/home/ubuntu
ubuntu@ubuntu:~$ echo \$HOME
$HOME
例子中,反斜線去除了“ $ ”字符的特殊意義,保留字面值,從而不輸出home目錄路徑。
例二:
ubuntu@ubuntu:~$ mv test.c \
> ../Downloads/
例子中,反斜線使行得以繼續,命令可以正常輸入。
到這里就明白了怎么查看文件名為“ \ ”的文檔了,只要輸入命令
ubuntu@ubuntu:~$ vi \\
就可以了,前一個反斜線保留了后一個反斜線的字面意思,即作為文件名輸入了。
這個問題解決了,但是又想到了與反斜線對應的,也是經常用到一個符號:正斜線(“ / ”),再來看看這兩個符號的區別。
在知乎上看到這么個說法:反斜線“\”是電腦出現了之后為了表示程序設計里的特殊含義才發明的專用標點。就是說,除了程序設計領域外,任何地方都不應該有使用反斜杠的時候,請永遠使用正斜線“/”。
粗略想想還真差不多是這么回事,但是馬上就想到一朵奇葩: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 說得很清楚:http://blogs.msdn.com/b/larryosterman/archive/2005/06/24/432386.aspx。