Shell

在 zsh 中執行腳本 - 文件權限

  • February 27, 2018

我對執行文件權限的行為不符合我的預期感到困惑。可能是因為我的預期是錯誤的。反正:

我有一個腳本文件,為簡單起見僅稱為s,位於~/bin. 對於本範例,該文件僅包含以下幾行:

#!/bin/zsh
echo "Test";

很簡單。

我導航到~/bin目錄,chmod文件權限s400- 即,僅對我來說是只讀的。沒有執行權限。然後我嘗試通過輸入它的路徑來執行腳本,給出這個:

% ./s
zsh: permission denied: ./s

到目前為止,一切都很好。由於權限錯誤,該文件無法執行。將權限提高到500(授予執行權限)也可以正常工作 - 使用這些權限,文件可以正常執行:

% ./s
Test

這一切都在預料之中。但是隨後我將chmod權限恢復為400(再次執行權限關閉),嘗試source輸入文件,這會發生:

% source s
Test

雖然權限是400,但腳本會執行。

所以這是我的問題:為什麼會./s失敗(就像它應該的那樣)但source s正常執行?這不會破壞執行權限的全部目的嗎?

400權限,sh szsh s工作。

我確定我在某處做錯事或理解錯事。有人可以向我指出在哪裡,並解釋 , 和 之間的./s區別嗎?source s``sh s``zsh s

當你執行時./s,你告訴核心執行程序s。如果你有執行權限,那麼核心會讀取文件的前幾個字節,看到這一#!行,因此它知道這是一個腳本,然後執行解釋器,將腳本名稱作為它的第一個參數傳遞給它。如果您沒有執行權限,核心將在第一步中止執行。

當你執行時zsh s,你執行zsh,並告訴它讀取被呼叫的文件s並將其解釋為命令。你不是在執行s,你是在執行zsh。與sh sor相同cat s

當你source s再次執行時,你告訴 zsh 讀取一個文件,所以重要的是你有讀取它的權限。

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