私は以前に Bash スクリプトを作成したことがありますが、最初はこれがなくてもすべて正常に動作していました。それを入れることのポイントは何ですか?物事はどう違いますか?
また、#
の発音はどうですか?私は!
が "bang"と発音されていることを知っています。
#!
はどのように発音されますか?
これは慣例なので、* nixシェルは実行するインタプリタの種類を知っています。
たとえば、古いバージョンのATTはデフォルトで sh (Bourne Shell)に、古いバージョンのBSDは csh (C Shell)にデフォルト設定されています。
今日でも(ほとんどのシステムがbashを実行している場所、 "Bourne Again Shell" )、スクリプトはbash、python、Perl、Ruby、PHPなどで作成できます。例えば、#!/bin/Perl
や#!/bin/Perl5
のようになります。
シモンズ:感嘆符(!
)は愛情を込めて "bang" と呼ばれています。シェルのコメント記号(#
)は "hash" と呼ばれることもあります。
PPS:覚えておいてください - * nixの下で、接尾辞をファイルタイプと関連づけることは単なる 規約 であり、 "規則" ではありません。 実行可能ファイル は、バイナリプログラム、100万種類のスクリプトタイプのいずれか、およびその他のものにすることができます。それゆえ#!/bin/bash
の必要性。
より正確に言うと、 Shebang#!
が executable (x
mode )ファイルの最初の2バイトの場合、 execve(2) と解釈されます。システムコール(プログラムを実行します)。しかし execve
のPOSIX仕様 はShebangに言及していない。
それにはインタプリタ実行ファイルのファイルパスが続かなければなりません(BTWは相対パスでも可能ですが、ほとんどの場合絶対パスです)。
ユーザの$PATH
の中でインタプリタ(例えばpython
)を見つけるためのNiceトリック(あるいはおそらく そんなにいい one)は、例えば以下のようにenv
プログラムを使うことです(すべてのLinuxでは/usr/bin/env
).
#!/usr/bin/env python
どのELF実行ファイルでもインタプリタになることができます。必要に応じて、#!/bin/cat
または#!/bin/true
を使用することもできます。 (しかしそれはしばしば役に立たないでしょう)
それは Shebang と呼ばれています。 unix-speakでは、#はシャープ(音楽のように)またはハッシュ(Twitterのハッシュタグのように)と呼ばれます。ビッグバンと呼ばれています。 (あなたは実際にあなたの前のシェルコマンドをbang-bangと呼ばれる!!で参照することができます)。それで、まとめると、haSH-BANG、またはShebangになります。
#の後の部分!実行するためにどのプログラムを使用するかをUnixに指示します。指定されていない場合は、bash(またはsh、zsh、または$ Shell変数がなんであれ)を試しますが、指定されている場合はそのプログラムを使用します。さらに、#はほとんどの言語でコメントであるため、後続の実行では行は無視されます。
オペレーティングシステムは、デフォルトのシェルをシェルスクリプトの実行に使用します。そのため、スクリプトの冒頭にシェルパスを記載しているので、あなたはOSにその特定のシェルを使用するように求めています。 移植性 にも便利です。
Shebang は、#!
の後に指定されたプログラムを、実行しようとしたときに問題のファイルのインタプリタとして使用するようにローダに指示するものです。したがって、foo.sh
が先頭にある#!/bin/bash
というファイルを実行しようとすると、実際に実行されるコマンドは/bin/bash foo.sh
です。これは、プログラムごとに異なるインタプリタを使用するための柔軟な方法です。これはシステムレベルで実装されたもので、ユーザーレベルのAPIはShebangの規約です。
Shebangは マジックナンバー - 与えられたインタプリタのスクリプトとしてファイルを識別する人間が読めるものであることも知っておく価値があります。
Shebangがなくても「動作する」ということについてのあなたの論点は、問題のプログラムがあなたが使用しているものと同じシェル用に書かれたシェルスクリプトであるという理由だけです。たとえば、JavaScriptファイルを作成してから、#! /usr/bin/js
(またはそれに類するもの)を入れて、JavaScriptの「シェルスクリプト」を作成できます。
すべてのディストリビューションにはデフォルトのシェルがあります。 bashはほとんどのシステムでデフォルトです。たまたま別のデフォルトシェルを持つシステムで作業している場合、スクリプトがBash専用に書かれていると、意図したとおりに機能しない可能性があります。
Bashはksh
とsh
からコードを取って長年にわたって進化してきました。
スクリプトの最初の行に#!/bin/bash
を追加すると、指定されたShell
を呼び出してスクリプト内の後続のコマンドを実行するようにOSに指示します。
#!
はしばしば「ハッシュバング」、「シェバン」、「シャバン」と呼ばれます。
これは Shebang と呼ばれます。これは、番号記号と感嘆符(#!)の後に、/ bin/bashなどのインタプリタへのフルパスが続きます。 UNIXおよびLinux上のすべてのスクリプトは、最初の行に指定されたインタプリタを使用して実行されます。
また、#!/ bin/bashの後に他のいくつかのパラメータが表示されます。#!/bin/bash -v -x
これを読んでもっとアイデアを得てください。
https://unix.stackexchange.com/questions/124272/what-do-the-arguments-v-and-x-mean-to-bash 。
そのライブラリをすぐに利用できない別のシステムを使用している人にとっては役に立つことがあります。それが宣言されておらず、そのシステムでサポートされていない関数がスクリプトにある場合は、#/ bin/bashを宣言する必要があります。私は仕事の前にこの問題に遭遇しました、そして今、私はただ練習としてそれを含めます。