我正在嘗試在 Linux 上學習 shell,但我遇到了一個似乎令人困惑的問題。
- 我的環境是:
- 作業系統:Manjaro 21.2.6 Qonos
- 內核:x86_64 Linux 5.15.38-1-MANJARO
- 外殼:zsh 5.8.1 (x86_64-pc-linux-gnu)
- 問題是:
- 我創建了一個名為 的檔案
foo,并#\!/bin/sh對其進行了回顯,并且檔案的權限foo已100通過使用chmod. - 該檔案
foo確實沒有讀取或寫入權限,這是真的, - 但是當我執行命令時
./foo,我得到了錯誤/bin/sh: ./foo: permission denied。
- 我創建了一個名為 的檔案
那么為什么Shell知道foo沒有讀取權限的檔案中的shebang是什么???
如果你們中的任何人都可以提出任何建議,我將非常感激!
行為示例
uj5u.com熱心網友回復:
那么為什么Shell知道沒有讀取權限的檔案foo中的shebang是什么???
讀取shebang行的不是shell,而是作業系統/內核。
shell 腳本的執行方式與編譯程式相同。該程序使用exec*族的功能并./foo作為程式傳遞來執行。這些函式基于系統呼叫。
作業系統/內核然后檢測該檔案是可以直接執行的編譯程式還是必須傳遞給解釋器的腳本檔案。如果檔案包含 shebang 行,作業系統將執行指定的解釋器,它不必是 shell,否則它將運行默認 shell。腳本檔案作為引數傳遞給解釋器。
shell 以普通用戶權限運行,當它試圖打開腳本檔案時會出錯。
您可以在函式族的POSIXexec規范execve或. 搜索單詞解釋器。您可以查看 Linux 內核源代碼以獲取更多詳細資訊。
uj5u.com熱心網友回復:
您收到此錯誤是因為腳本本身沒有執行或讀取權限。要在 shell 中運行腳本(在您的路上),您需要具有讀取和執行權限:
chmod 500 foo
./foo
運行腳本的另一種方法是:
sh foo
在這種情況下,您不需要執行權限。作為記錄,標準方法是使用如下構造:
#!/bin/sh
你不需要轉義感嘆號
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/480257.html
