Files

為什麼linux使用文件副檔名來決定打開文件的預設程序,儘管它獨立於文件副檔名

  • March 8, 2016

我有一個文本文件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 不儲存有關文件格式的任何元資訊。.pdf因此,當您在文件管理器中點擊文件時(或者當您.pdf在適當配置的 zsh 命令行上執行文件等時),文件管理器會查詢數據庫以查找哪個應用程序是.pdf文件的首選應用程序。該數據庫可以分為兩部分,一部分將擴展與 MIME 類型(/etc/mime.types, ~/.local/share/mime)相關聯,另一部分將 MIME 類型與應用程序相關聯(/etc/mailcap,~/.local/share/applications),但即便如此,起源是擴展。雖然通常可以從文件內容中找出應用程序,但這會比較慢,而且並不總是可能的(許多格式看起來就像文本文件,a.jar是 的一種.zip,等等)。

Linux不需要文件副檔名,它不使用它們來確定如何執行執行檔,但它確實使用它們來確定使用哪個程序來打開數據文件。

¹該文件必須是本機執行檔,shebang 執行檔不能指向另一個 shebang 執行檔以避免潛在的無休止遞歸。

引用自:https://unix.stackexchange.com/questions/266999