Permissions
為什麼 README.md 會顯示為執行檔?
這是在 Mac 上,但我認為這是 Unixy 問題。
我剛剛分叉了一個 Github 儲存庫(這個)並將其複製到 U 盤(與創建儲存庫的設備一起提供的那個)。在
ls
ing 之後,我注意到 README.md 以紅色突出顯示。果然,它的權限是:-rwxrwxrwx 1 me staff 133B 15 Jun 08:59 README.md*
我嘗試跑步
chmod 644 README.md
,但沒有任何變化。這裡發生了什麼?
因為文件的“可執行性”是 UNIX 系統上文件條目的屬性,而不是 Windows 上的文件類型的屬性。
簡而言之,
ls
如果任何所有者、組或每個人都具有文件的執行權限,則將文件列為執行檔。它不關心文件類型是什麼,只關心權限是什麼。這種行為有兩個顯著的好處:
- 您不必做任何特別的事情來處理新的可執行格式。這對於腳本語言特別有用,您可以在其中嵌入解釋器並
#!
在文件頂部添加一行。核心不必知道.py
文件是可執行的,因為權限告訴它這一點。這也與 Linux 上的支持相結合binfmt_misc
,可以做一些非常簡潔的事情,例如如果你安裝了 Wine,則將 Windows 控制台程序視為本機二進製文件。- 它可以讓您說某些技術上是機器程式碼的文件不能或不應該被執行。這也主要用於腳本語言,在這些語言中,具有在文件格式和執行檔方面無法區分的庫並不罕見。因此,使用上面的 python 範例,它可以讓你說人們不應該直接從 Python 標準庫執行任意模組,即使它們有
.py
擴展。但是,如果您被困在處理不支持 POSIX 權限的文件系統,例如 FAT(或 NTFS,如果您沒有設置使用者映射),那麼這一切都會崩潰。如果文件系統不儲存 POSIX 權限,則作業系統必須模擬它們。在 Linux 上,預設設置是為每個人設置讀寫和執行權限,這樣使用者就可以對文件做他們想做的事。沒有這個,您將無法從 USB 快閃記憶體驅動器執行腳本或二進製文件,因為核心不允許您修改每個文件的此類文件系統的權限。
在您的特定情況下,
git
儲存它在送出文件時看到的屬性,並且 README.md 文件的原始送出(或後續送出之一)可能發生在處理此類事情的 Windows 系統上非常不同,因此git
只是將權限儲存為每個人的完全訪問權限,類似於 Linux 在沒有權限支持的情況下處理文件系統的方式。