[英]Why the shell knows the interpreter specified in the shebang-line of a file without read permission
我正在嘗試在 Linux 上學習 shell,但我遇到了一個似乎令人困惑的問題。
foo
的文件,並向其回顯#\!/bin/sh
,並且使用chmod
將文件foo
的權限修改為100
。foo
確實沒有讀寫權限,這是真的,./foo
時,出現錯誤/bin/sh: ./foo: permission denied
。 那么為什么 Shell 在沒有讀取權限的情況下知道文件foo
中的 shebang 是什么???
如果你們中的任何人可以提出任何建議,我將非常感激!
您收到此錯誤是因為腳本本身沒有執行或讀取權限。 要在 shell 中運行腳本(在您的路上),您需要具有讀取和執行權限:
chmod 500 foo
./foo
運行腳本的另一種方法是:
sh foo
在這種情況下您不需要執行權限。 作為記錄,標准方法是使用如下構造:
#!/bin/sh
您不需要轉義感嘆號
那么為什么 Shell 在沒有讀取權限的情況下知道文件 foo 中的 shebang 是什么???
讀取 shebang 行的不是 shell,而是操作系統/內核。
shell 腳本可以像編譯程序一樣執行。 該進程使用exec*
系列的 function 並傳遞./foo
作為要執行的程序。 這些功能基於系統調用。
操作系統/內核然后檢測該文件是可以直接執行的已編譯程序還是必須傳遞給解釋器的腳本文件。 如果文件包含 shebang 行,操作系統將執行指定的解釋器,它不必是 shell,否則它將運行默認的 shell。腳本文件作為參數傳遞給解釋器。
shell 以普通用戶權限運行,在嘗試打開腳本文件時會出錯。
您可以在exec
function 系列的 POSIX 規范或execve
的 Linux 手冊頁中找到有關執行腳本的一些信息。 搜索單詞interpreter 。 您可以查看 Linux kernel 源代碼以獲取更多詳細信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.