Shell
在 zsh 中執行腳本 - 文件權限
我對執行文件權限的行為不符合我的預期感到困惑。可能是因為我的預期是錯誤的。反正:
我有一個腳本文件,為簡單起見僅稱為
s
,位於~/bin
. 對於本範例,該文件僅包含以下幾行:#!/bin/zsh echo "Test";
很簡單。
我導航到
~/bin
目錄,chmod
文件權限s
為400
- 即,僅對我來說是只讀的。沒有執行權限。然後我嘗試通過輸入它的路徑來執行腳本,給出這個:% ./s zsh: permission denied: ./s
到目前為止,一切都很好。由於權限錯誤,該文件無法執行。將權限提高到
500
(授予執行權限)也可以正常工作 - 使用這些權限,文件可以正常執行:% ./s Test
這一切都在預料之中。但是隨後我將
chmod
權限恢復為400
(再次執行權限關閉),嘗試source
輸入文件,這會發生:% source s Test
雖然權限是
400
,但腳本會執行。所以這是我的問題:為什麼會
./s
失敗(就像它應該的那樣)但source s
正常執行?這不會破壞執行權限的全部目的嗎?在
400
權限,sh s
也zsh s
工作。我確定我在某處做錯事或理解錯事。有人可以向我指出在哪裡,並解釋 , 和 之間的
./s
區別嗎?source s``sh s``zsh s
當你執行時
./s
,你告訴核心執行程序s
。如果你有執行權限,那麼核心會讀取文件的前幾個字節,看到這一#!
行,因此它知道這是一個腳本,然後執行解釋器,將腳本名稱作為它的第一個參數傳遞給它。如果您沒有執行權限,核心將在第一步中止執行。當你執行時
zsh s
,你執行zsh
,並告訴它讀取被呼叫的文件s
並將其解釋為命令。你不是在執行s
,你是在執行zsh
。與sh s
or相同cat s
。當你
source s
再次執行時,你告訴 zsh 讀取一個文件,所以重要的是你有讀取它的權限。