Linux下反斜槓號 引發的思考

2021-07-16 22:03:20 字數 1962 閱讀 8667

刪除方法:rm -rf \\

linux下反斜槓號」\」引發的思考

**:今天在檢查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 說得很清楚:

Linux下反斜槓號

今天在檢查home目錄時發現有乙個名為 的檔案,覺得很奇怪,從來沒見過,就準備用vim開啟看看,很自然地輸入命令檢視一下,結果居然打不開。ubuntu ubuntu vi ubuntu ubuntu 稍微思考了一下就明白了,不是打不開,問題出在這個檔名 上面。反斜線符號 在bash中被解釋為轉義字元...

Linux中 和 的區別,正斜槓和反斜槓的區別

1 反斜線 是電腦出現了之後為了表示程式設計裡的特殊含義才發明的專用標點。就是說,除了程式設計領域外,任何地方都不應該有使用反斜槓的時候,請永遠使用正斜線 2 windows系統中用反斜線 來表示目錄,但是linux下用正斜線 來表示 3 windows 是表示引數,是表示本地路徑。linux和un...

雙反斜槓引發的正規表示式錯誤

今天寫js所填資料的校驗時,遇到了以下的錯誤。特此記錄 uncaught syntaxerror invalid regular expression d d nothing to repeat 原始碼 var reg new regexp d d 查德一看,好像沒有什麼錯誤。但是細心就會發現。丟擲...