.shファイルの最初の行コメントが必要なのはなぜですか? [コピー]

.shファイルの最初の行コメントが必要なのはなぜですか? [コピー]

#!/bin/bashシェルスクリプトファイルの最初のshebang()行が必要で、この行がないとファイルが正しく実行されないと聞きました。しかし、いくつかのスクリプトをテストしました。その線なしでうまく動作します。

この行はただのコメントですか? bashは他のコメントのようにこの行を省略しますか?それとも、bashはそれを解釈しますか?

行はその形式でなければなりませんか?それとも読めるだけの便利なコメントですか? 、なしで別の方法で表現したらどうでしょうか!

答え1

カーネル1自体はこれを知っています。 shebangがあるはずです。それ以外の場合、カーネルはそのファイルを実行可能ファイル(スクリプト)と見なします。

Linuxでは、execシステムコール(別名execve)は次のコードを呼び出します。 linux/fs/binfmt_script.c

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

ただし、shebangがない場合、シェルはファイル自体を実行することを選択できます。バラより 最初にshebang行()がないとき、どのシェルがスクリプトを実行しますか?#!/path/to/shell  したがって、シェルスクリプトでは動作しているように見えますが、依存する必要のある機能ではありません。

しかし、シェルスクリプトがbashismを使用している場合はどうなりますか?#!/bin/bashその後、他のシェルではなくbashで実行する必要があります。同様に、実行したいプログラム自体がシェルでない場合でも実行されます。 PerlやPythonなど、まったく異なる言語で書かれたスクリプトもあります。 shebang がなければ、システムはこれらのタスクにどの通訳者を使用すべきかを知ることができません。

______________
1 これは  Unixの機能です。方法Linuxの前に参照してください。シェルボーンの歴史

答え2

これシェルボーンスクリプトの実行時にどのプログラムを呼び出すかをカーネルに伝えます。まっすぐ

chmod +x myscript.sh
./myscript.sh

答え3

Shebangは、次のいずれかの条件が満たされている場合にのみ必要です。

  • あなたのスクリプトは移植不可能です。つまり、POSIX標準でサポートされていないエントリ(bashisms、kshismsなど)を使用するため、どのインタプリタを起動する必要があるかを指定する必要があります。これには明らかに外国のスクリプト言語(csh、perl、python...)が含まれます。あなたの質問はに関するものなので、#!/bin/bashあなたに当てはまる可能性が高いです。

  • POSIX以外の環境/モードでスクリプトを実行しています。

それ以外の場合は、shebangは必要なく、実際にシェルスクリプトに厳密に準拠している場合でもお勧めできません。その理由は、一般的な信念にもかかわらず、/bin/shPOSIXシェルの基本的なパスが必ずしも必要ではないからです。標準シェルの位置を検索する唯一のサポート方法は、次を実行することです。

PATH=`getconf PATH` command -v sh

POSIX規格状態:

シェルコマンドファイルの最初の行が「#!」文字で始まる場合、結果は指定されません。

答え4

サプリメントとしてフロストスーツの答え、一部のシェルはハッシュバン行を解釈できます。 Bashは通常、カーネルがハッシュバンの解釈をサポートしていない場合にのみこの機能を有効にします。

しかし、shebangsラインを使用するには、カーネルソースコードよりもBashソースコードで使用する方が簡単です。

からbash/execute_cmd.c

#if !defined (HAVE_HASH_BANG_EXEC)
    if (sample_len > 2 && sample[0] == '#' && sample[1] == '!')
        return (execute_shell_script (sample, sample_len, command, args, env));
    else
#endif

からbash/config.h

/* Define if the kernel can exec files beginning with #! */
#define HAVE_HASH_BANG_EXEC 1

関連情報