Bash
為什麼 Bash 的源碼不需要執行位?
使用 Bash
source
可以在沒有設置執行位的情況下執行腳本。這是記錄和預期的行為,但這不是反對使用執行位嗎?我知道,這
source
不會創建子外殼。
Bash 是一個解釋器;它接受輸入並做任何它想做的事情。它不需要注意可執行位。事實上,Bash 是可移植的,可以在沒有任何可執行位概念的作業系統和文件系統上執行。
真正關心可執行位的是作業系統核心。例如,當 Linux 核心執行時
exec
,它會檢查文件系統是否未使用noexec
選項掛載,它會檢查程序文件的可執行位,並強制執行安全模組(例如 SELinux 或 AppArmor)施加的任何要求。請注意,可執行位是一種相當隨意的控制。例如,在 Linux x86-64 系統上,您可以通過顯式呼叫
/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
解釋器來繞過核心對可執行位的驗證:cp /bin/ls /tmp/ chmod -x /tmp/ls /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 /tmp/ls
這有點類似於在 Bash 中獲取 Bash 原始碼,除了它
ld.so
是解釋器,它執行的程式碼是 ELF 格式的機器程式碼。
source
或等效但標準的點.
不執行腳本,而是從腳本文件中讀取命令,然後在目前 shell 環境中逐行執行它們。沒有什麼反對使用執行位,因為shell只需要讀取權限就可以讀取文件的內容。
只有在執行腳本時才需要執行位。在這裡,shell 將
fork()
新建程序,然後使用execve()
函式從腳本創建新的程序映像,該腳本需要是正常的執行檔。