为什么 .sh 文件的第一行注释是必需的?

use*_*312 5 scripting bash shebang

有人告诉我#!/bin/bash,shell 脚本文件中的第一行 shebang ( ) 是必需的,如果没有这一行,文件将无法准确运行。但是我测试了一些脚本。没有那条线,他们工作得很好。

那行只是一条评论吗?bash 是否像其他注释一样省略了这一行?还是 bash 解释它?

那条线是强制采用那种格式吗?或者只是一个有用的可读笔记?如果我换一种方式,比如说,没有!?

fro*_*utz 10

内核本身对此非常清楚。shebang 必须在那里,否则它不会将这样的文件视为可执行脚本。

linux/fs/binfmt_script.c

static int load_script(struct linux_binprm *bprm)
{
[...]
    if ((bprm->buf[0] != '#') || (bprm->buf[1] != '!'))
            return -ENOEXEC;
Run Code Online (Sandbox Code Playgroud)

但是,如果缺少shebang,shell 可能会选择自己执行该文件。所以它似乎适用于 shell 脚本,但它不是您应该依赖的功能。

但是,如果您的 shell 脚本使用 bashisms 呢?你必须有#!/bin/bashthen 所以它会在 bash 中执行,而不是其他一些 shell。同样,如果尝试执行它的程序不是 shell 本身,它将被执行。然后是完全不同语言的脚本,例如 Perl 或 Python。如果没有shebang,系统将不知道该使用哪个解释器。


Ign*_*ams 8

家当告诉哪个程序在执行脚本调用内核直接

chmod +x myscript.sh
./myscript.sh
Run Code Online (Sandbox Code Playgroud)