- bash shebangは何をしますか?
./file
ファイルの使用と実行の違いは何ですかsh file
?- bashはそれをどのように理解していますか?
答え1
- Shebangの機能は次のとおりです。
インタプリタディレクティブを使用すると、スクリプトとデータファイルをコマンドとして使用できるため、コマンドラインでインタプリタの前にスクリプトを付ける必要がなくなり、ユーザーや他のプログラムで実装の詳細を隠すことができます。
- ./fileまたはshファイルを使用してファイルを実行することの違いは何ですか?
some/path/to/foo パスで識別される Bourne シェルスクリプトには最初の行があります。
#!/bin/sh -x
パラメータbarとbazを使用して実行します。
some/path/to/foo bar baz
実際、次のコマンドラインを実行するのと同様の結果が得られます。
/bin/sh -x some/path/to/foo bar baz
注:Dennis Ritchieは1980年にインタプリタ命令のカーネルサポートを導入しました。
The system has been changed so that if a file being executed begins with the magic characters #! , the rest of the line is understood to be the name of an interpreter for the executed file. Previously (and in fact still) the shell did much of this job; it automatically executed itself on a text file with executable mode when the text file's name was typed as a command. Putting the facility into the system gives the following benefits. 1) It makes shell scripts more like real executable files, because they can be the subject of 'exec.' 2) If you do a 'ps' while such a command is running, its real name appears instead of 'sh'. Likewise, accounting is done on the basis of the real name. 3) Shell scripts can be set-user-ID.
注:Linuxは、解釈されたすべての実行可能ファイル(つまり、#!行で始まる実行可能ファイル)のsetuidビットを無視します。
4) It is simpler to have alternate shells available; e.g. if you like the Berkeley csh there is no question about which shell is to interpret a file. 5) It will allow other interpreters to fit in more smoothly.
追加情報:
答え2
ハッシュバンの機能は次のとおりです。コアファイルの実行時にスクリプトインタプリタとして実行されるプログラムは何ですか?
プログラムを実行するには、./program
そのファイルに対する実行権限が必要ですが、どのタイプのプログラムなのかわかりません。 bashスクリプト、shスクリプト、Perl、Python、awk、またはExpectスクリプト、または実際のバイナリ実行可能ファイルです。実行すると、他のものは実行されず、以下sh program
で実行されます。sh
sh
とは違う点を参考にしてくださいbash
!後者には、標準シェルには未知の多くの高度な機能があります。システムによっては、sh
他のプログラムでも互換モードのBashでも構いませんが、結果は通常同じです。高度な機能にアクセスできません。
Bash自体はhashbang行を理解していませんが、それを読むためにカーネルに依存しています。一方、Perl インタプリタは起動方法に関係なく hashbang 行自体を読み込みます。 hashbang行に設定されたコマンドラインオプションを選択するためにこれを行います。バッシュはこのようなことをしません。
./script
たとえば、次のスクリプトは(exec
hashbang行を介して)またはbash script
(bashインタプリタを手動で実行して)起動したかどうかによって動作が異なります。
#!/bin/bash -u
echo $1
答え3
bash
shebang行自体は何の意味もなく、単にコメントとして扱われます。シェルがコマンドラインを読み取り、コマンドが外部プログラムである場合cd
(execve
..その後、カーネルはexecve
ファイルに渡された実行可能ファイルの種類を調べて確認します)。マジックナンバーファイルの先頭に。マジックナンバーが2バイト0x23 0x21(ASCII文字#!
)で構成されている場合、カーネルはその後にスクリプトインタプリタへの絶対パスが続くと仮定します。その後、カーネルはインタプリタを起動してスクリプトに渡します。
答え4
まあ、100%正確に言えば、「bash shebang」には何もありません。 Shebangはさまざまな形で現れることができます。これは通訳者ディレクティブだけです。たとえば、shebangが#!/usr/bin/perl
f.exを行うことができるとしましょう。 "perl shebang"であり、Perlインタプリタにそのようなスクリプトのインタプリタとして機能するように指示します。その後、これらのPerlスクリプトをシェルスクリプトのように直接呼び出すことができます。他のスクリプトインタプリタにも同様に適用されます。これは、php、cshell、prolog、basic、または任意の方法でテキストファイルを解釈する他のプログラムです。もちろん、通訳者はシェバンを無視できなければなりません。 bashの場合、これはコメントを減らすだけです。 PHPとPerlも同様です。私はプロローグがその声明に窒息すると思います。 shebangはまた、テキストを解釈してshebangを無視できる限り、あなたのアプリケーションとシームレスに連携する必要があります。
f.ex.なら面白いでしょう。 JavaScript インタプリタはこれらの「Javascript shebang」を無視できます。 :)