為什麼linux使用文件副檔名來決定打開文件的預設程序,儘管它獨立於文件副檔名
我有一個文本文件
abc.text
,它的內容為Hi I'm a text file.
如果我點兩下打開此文件,則文件將在
gedit
編輯器中打開。然而,如果我將文件重命名為
abc.html
(不更改其任何內容),則預設情況下它會在 Chrome 中打開。這種行為在 Windows 機器上是可以接受的,因為 Windows 使用文件副檔名來辨識文件類型。但據我所知,Linux 不需要文件副檔名。
那麼為什麼在 Linux 中更改文件副檔名會更改打開它的預設程序呢?
Linux 不使用文件副檔名來決定如何打開文件,但 Linux 使用文件副檔名來決定如何打開文件。
這裡的問題是“Linux”可以指定作業系統的不同部分,而“打開文件”也可能意味著不同的東西。
Linux 和 Windows 之間的區別在於它們如何處理應用程序文件和數據文件。在 Windows 上,兩者之間的界限是模糊的;執行檔有幾種類型,它們由它們的副檔名(
.exe
、.bat
等)確定,但在大多數情況下,您可以“執行”任何文件(例如,通過點擊資源管理器),這會執行關聯的執行檔使用該文件類型,其中文件類型完全由副檔名確定(因此執行.doc
文件可能會啟動c:\Program Files\something or other\winword.exe
,執行.py
文件可能會啟動 Python 解釋器等)。在 Linux 上,有一個獨立於文件名的執行檔的概念。執行檔通常沒有副檔名,因為它們是由使用者輸入的。文件的類型無關緊要,使用者要做的就是執行文件。核心根據文件內容確定如何執行文件:它本身就知道一些文件類型,shebang機制允許文件將任何其他執行檔¹聲明為其解釋器。
另一方面,數據文件通常具有指示數據類型的副檔名。這裡的一般想法是,數據類型與用於打開文件的應用程序不是同義詞。您可能想在 Okular、Evince、Xpdf、Acroread 或 Mupdf 等中查看 PDF。
然而,有許多工具允許打開數據文件,而無需明確指定要使用的應用程序。這些工具幾乎完全根據文件副檔名做出決定。文件副檔名和文件內容是這些工具可以使用的唯一資訊:Linux 不儲存有關文件格式的任何元資訊。
/etc/mime.types
,~/.local/share/mime
)相關聯,另一部分將 MIME 類型與應用程序相關聯(/etc/mailcap
,~/.local/share/applications
),但即便如此,起源是擴展。雖然通常可以從文件內容中找出應用程序,但這會比較慢,而且並不總是可能的(許多格式看起來就像文本文件,a.jar
是 的一種.zip
,等等)。Linux不需要文件副檔名,它不使用它們來確定如何執行執行檔,但它確實使用它們來確定使用哪個程序來打開數據文件。
¹該文件必須是本機執行檔,shebang 執行檔不能指向另一個 shebang 執行檔以避免潛在的無休止遞歸。