#!#!#!#!#!#!#!#!#!#!#!/bin/shと#!/bin/bash?

Linuxや他のUnixライクなシステムでは、複数のシェルを選択できます。

シェルは、あなたの小さなプロンプトを描画するだけでなく、特にパイプや条件などの複雑なロジックを入れた場合、コマンドを解釈する責任があ

bashは、Linuxシステムのユーザーのためのデフォルトのシェルとして使用される最も一般的なシェルです。 これはUnixの歴史を通して使用されている他のシェルの精神的な子孫です。 その名前であるbashはBourne-Again Shellの略語であり、cシェルとKornシェルの機能も組み込まれていますが、置き換えるように設計されたBourne shellへのオマージュです。

最近は/bin/bashから実行されています-bashを持つシステムはここでアクセスできます。

ただし、シェルを使用するのはユーザーだけではありません。 スクリプト(シェルスクリプト)は、それらを解釈するためにシェルを必要とします。 シェルスクリプトを実行する場合、システムはスクリプトを実行するためにシェルプロセスを起動する必要があります。

問題は、異なるシェルにはそれらの間に小さな矛盾があり、スクリプトを実行することになると、これらは本当の問題になる可能性があることです。 bashには、他のシェルではなく、bashにのみ固有のスクリプト機能が非常に多くあります。 これらのスクリプトを実行するために常にbashを使用する場合、これは問題ありません。 他のシェルは、bashをエミュレートするか、bashがかなりよくサポートするPOSIX標準に準拠しようとするかもしれません(ただし、独自の拡張機能が追加されます)。

シェルスクリプトの先頭で、shebangを使用してどのシェルを実行するかを指定することができます。 つまり、スクリプトは常に別のシェルではなくbashで実行する必要があります。

/bin/shはシステムシェルを表す実行可能ファイルです。 実際には、通常、システムシェルであるシェルの実行可能ファイルを指すシンボリックリンクとして実装されています。 システムシェルは、システムスクリプトが使用すべきデフォルトのシェルの一種です。 Linuxディストリビューションでは、長い間、これは通常bashへのシンボリックリンクであったため、/bin/shをbashまたはbash互換のシェルに常にリンクすることは しかし、ここ数年で、Debian(およびUbuntu)はシステムシェルをbashからdashに切り替えることに決めました-同様のシェル-/bin/shにbashを使用するLinux(よく、GNU)の長い伝統 Dashは、起動速度(およびパッケージインストールスクリプトのような多くのシェルスクリプトを必要とする他のもの)に有益な、より軽く、はるかに高速なシ

Dashはbashとかなりよく互換性があり、同じPOSIX標準に基づいています。 ただし、bash固有の拡張機能は実装していません。 Shebangとして#!/bin/sh(システムシェル)を使用するが、bash固有の拡張を必要とするスクリプトが存在する。 これは現在、DebianとUbuntuによって修正されるべきバグと考えられています。/bin/shがdashを指し示したときに動作できるようにする必要があります。

Ubuntuのシステムシェルがdashを指していますが、ユーザーとしてのログインシェルはこの時点でbashであり続けます。 つまり、Linuxのどこかの端末エミュレータにログインすると、ログインシェルはbashになります。 シェルが対話的に使用され、ユーザーがbashに精通している場合(およびホームディレクトリにbash固有のカスタマイズがある場合)、操作の速度はそれほど問題

スクリプトを書くときに使うべきこと

スクリプトがbashでのみサポートされている機能を必要とする場合は、#!/bin/bashを使用します。

しかし、可能であれば、スクリプトがPOSIX互換であることを確認し、#!/bin/shを使用することをお勧めします。

は、常に、非常に確実に、任意のインストールで推奨されるPOSIX互換のシステムシェルを指す必要があります。

コメントを残す

メールアドレスが公開されることはありません。