GNU/Linux >> Linux の 問題 >  >> Linux

LinuxシェルスクリプトのShebangとは何ですか?

次で始まるシェルスクリプトに出くわすことがよくあります:

#!/bin/bash

この#! シバンまたはハッシュバンと呼ばれます。シバンは、特にさまざまな種類のシェルを処理するときに、シェルスクリプトで重要な役割を果たします。

このチュートリアルでは、次のことを学びます。

  • シバンとは何ですか?
  • シェルスクリプトでどのように重要な役割を果たしますか?

シェルスクリプトのシバンとは何ですか?

シバンは、#(ポンドキー)と!の組み合わせです。 (エクスクラメーション・マーク)。この文字の組み合わせは、スクリプトの最初の行で使用される場合に特別な意味を持ちます。これは、特定のスクリプトがデフォルトで実行されるインタープリターを指定するために使用されます。

したがって、スクリプトの最初の行が次の場合:

#!/bin/bash

これは、インタプリタがbashシェルである必要があることを意味します。最初の行が次の場合:

#!/bin/zsh

使用するインタプリタがZシェルであることを意味します。

#! #はシェルスクリプトのコメントに使用されるため、確かに特別ですが、ここでは特別な意味があります。

シェルスクリプトでシバンが重要なのはなぜですか?

つまりね。シェルの実行可能ファイルが後に続くshebangは、スクリプトに必須ではありません。

次のような簡単なスクリプトを作成する場合:

echo "Namaste, folks!"

そして、実行権限を与えて、で実行します。オペレーターの場合、ログインシェルによって実行されます。

[email protected]:~$ cat sample 
echo "Namaste, folks!"
[email protected]:~$ chmod u+x sample 
[email protected]:~$ ./sample 
Namaste, folks!

では、なぜシェルスクリプトの先頭に#!/ bin / bash行が含まれているのですか?

LinuxおよびUNIXシステムで使用できるシェルがいくつかあるためです。これらのシェルの構文はほとんど一般的ですが、構文や処理方法が異なります。

これが、スクリプトで正しいシェルインタープリターを指定することが重要になる理由です。指定しないと、一部のスクリプトが異なるシェルで実行されたときに異なる結果を生成する可能性があります。

簡単な例でそれをお見せしましょう。

シバンでシェルインタープリターを指定することの重要性

ディストリビューションの配列を使用してサンプルシェルスクリプトを作成しました。次に、スクリプトはインデックス2にディストリビューションを表示します。

distros=("Ubuntu" "Fedora" "SUSE" "Debian")
echo "Distro at index 2 is: ${distros[2]}"

シェルインタープリターを指定するためのシバン行を追加していません。つまり、このスクリプトを実行すると、デフォルトのシェル(私の場合はbash)で実行されます:

[email protected]:~$ echo $0
bash

スクリプトの出力を推測できますか?

[email protected]:~$ ./arrays.sh 
Distro at index 2 is: SUSE

Bashや他の多くのプログラミングおよびスクリプト言語では配列インデックスが0から始まるため、インデックス2にSUSEが表示されます。しかし、Zシェルではそうではありません。 Zシェルでは、配列インデックスは1から始まります。

システムにZシェルをインストールしています。スクリプトを変更し、シバン行を追加して、スクリプトをデフォルトでZシェルで実行するように指定します。

#!/bin/zsh

distros=("Ubuntu" "Fedora" "SUSE" "Debian")
echo "Distro at index 2 is: ${distros[2]}"

スクリプトを実行したときの出力を推測できますか?

[email protected]:~$ ./arrays.sh 
Distro at index 2 is: Fedora

今、違いに気づきましたか?同じスクリプトですが、シバンラインを追加することで違いが生まれました。

そしてこれが、shebang演算子で正しいシェルインタープリターを指定することが重要である理由です。システム管理者は、bash、ksh、zshなど、特定のシェルを念頭に置いてシェルスクリプトを作成できます。ただし、スクリプトを実行するシステムに、自分のシステムと同じデフォルトシェルがあるかどうかを確認することはできません。今、物事は理にかなっていますよね?

シェルを明示的に指定した場合、シバンは無視されます

なぜ「デフォルト」シェルに重点を置いているのですか? shebangは、スクリプトを実行するインタプリタを指定しているためです。

ただし、シェルを明示的に指定することはできます。その場合、シバンラインは無視されます。

シェバンはどの程度正確に機能しますか?

スクリプトの最初の行でシバンを使用すると、指定されたコマンドで指定されたスクリプトを実行するようにシェルに指示します。

基本的に、#!/bin/zsh と同等です:

/bin/zsh script_name

スクリプトの最初の行がshebangで始まる場合は、シェルインタープリターを指定していることを意味します。

それは部分的にしか真実ではありません。実際、それがシェバンキャラクターの目的です。ただし、shebang行にシェルの実行可能ファイルが含まれている必要はありません。何でもかまいません。

たとえば、#!/bin/zshを置き換えます #!/bin/catを使用 。 / bin/catはcatコマンドの実行可能ファイルです。

#!/bin/cat

distros=("Ubuntu" "Fedora" "SUSE" "Debian")
echo "Distro at index 2 is: ${distros[2]}"

これは、このスクリプトがcatで実行されることを意味します コマンドを実行し、スクリプトの内容を表示します。

実行可能コマンドを指している限り機能します。ランダムなものを入れると、エラーが発生します。

シバンラインを次のように変更します:

#!/home/abhishek

明らかに、コマンドの実行可能ファイルを指していないため、不正なインタプリタエラーがスローされます。

[email protected]:~$ cat arrays.sh 
#!/home/abhishek

distros=("Ubuntu" "Fedora" "SUSE" "Debian")
echo "Distro at index 2 is: ${distros[2]}"
[email protected]:~$ ./arrays.sh 
bash: ./arrays.sh: /home/abhishek: bad interpreter: Permission denied
結論

この記事を終了する前に、さらにいくつか質問に答えさせてください。

  • #の間にスペースがないことが重要です および! 。次のように使用することはできません:# !/bin/bash
  • ほとんどのシステムでは、#!の間にスペースを入れることができます および/bin/bash ただし、#!の間にスペースを入れないようにすることをお勧めします および/bin/bash
  • #! 最初の行にある必要があります。そうでない場合、シバン行はコメントとして扱われます。その前に空白行を置くことさえできません。

理由をもっとよく理解していただければ幸いです。 Linuxのシェルスクリプトの最初に使用されます。質問や提案があれば、遠慮なくコメントを残してください。


Linux
  1. シェル スクリプトとはシェル スクリプトの作成方法

  2. Linux シェル スクリプトでのバックティック (`) 記号

  3. stdin からパイプされたスクリプトを実行する (Linux/シェル スクリプト)

  1. `:-`はシェルスクリプトで何を意味しますか?

  2. % は Linux シェル文字列で何をしますか?

  3. シェル スクリプトで Linux を使用してテンプレートを作成しますか?

  1. Linuxでシェルスクリプトを使用してJsonを解析する方法は?

  2. UNIX/Linuxでシェルスクリプトを実行する4つの方法

  3. Linux シェルの音訳スクリプト