即使脚本没有设置为可执行文件,它们也能运行吗?

Ash*_*ame 34 scripts

我似乎可以运行脚本(.sh),无论是否将它们设置为可执行文件。那么这到底重要在哪里呢?

gei*_*rha 35

假设您有myscript包含以下内容的文件:

#!/bin/bash
echo "Hello, World!"
Run Code Online (Sandbox Code Playgroud)

如果您将此文件设为可执行并使用 运行它./myscript,那么内核将看到前两个字节是#!,这意味着它是一个脚本文件。然后内核将使用该行的其余部分作为解释器,并将文件作为它的第一个参数传递。所以,它运行:

/bin/bash myscript
Run Code Online (Sandbox Code Playgroud)

bash 读取文件并执行其中包含的命令。

因此,对于 bash(或您的脚本需要的任何解释器)来“执行”脚本,它只需要能够读取文件。

因此,对于脚本,执行位只是让执行它更方便一些。只要 bash 是可执行的,您始终可以使用脚本文件作为参数运行 bash,或者以交互方式运行 bash 并将脚本逐行复制粘贴到终端中以执行命令。

  • 如果我不知道正确的解释器,我应该使用什么来代替 /bin/bash?是否有根据shebang行运行脚本的命令? (2认同)

Lek*_*eyn 17

确保您没有将“执行 shell 脚本”与“使用 sh 运行 shell 脚本”混淆。

这不会受到以下文件权限的影响file.sh

sh file.sh
Run Code Online (Sandbox Code Playgroud)

您正在执行sh(解析为程序/bin/sh),它读取file.sh并执行它的代码。

如果您真的执行脚本本身,文件权限就会生效:

./file.sh
Run Code Online (Sandbox Code Playgroud)

请注意,非 Linux 文件系统(如 FAT)不支持文件权限。因此,即使您运行chmod -x file.sh,该文件仍将具有以前的权限。

执行权限由文件系统强制执行。但是程序也可以通过读取文件内容来“执行”代码,这绕过了“执行”的文件系统权限。