簡體   English   中英

為什么 shell 在沒有讀取權限的情況下知道文件的 shebang 行中指定的解釋器

[英]Why the shell knows the interpreter specified in the shebang-line of a file without read permission

我正在嘗試在 Linux 上學習 shell,但我遇到了一個似乎令人困惑的問題。

  • 我的環境是:
    • 操作系統:Manjaro 21.2.6 Qonos
    • Kernel:x86_64 Linux 5.15.38-1-MANJARO
    • Shell:zsh 5.8.1 (x86_64-pc-linux-gnu)
  • 問題是:
    • 我創建了一個名為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM