さまざまな種類のシェルがあるので、bashとシェルスクリプトの違いは何ですか?すべてのUnixシェルで実行される互換性のあるスクリプトを書くことは可能ですか?
答え1
スクリプトbash
はBourne-Again SHellによって解釈されるスクリプトなので、シェルスクリプトです。他のシェルでは正常に実行される場合と実行されない場合があります。特定の構文を使用すると、他のbash
シェルでも機能するかどうかはわかりません。
すべてのシェルで解釈できるスクリプトを作成するには、POSIX標準で説明されている構文を使用する必要があります。シェルコマンド言語。当然じゃないみんなシェルはPOSIX標準に準拠していますが、これが最善の方法です。これらのスクリプトは非常に移植性があり、多くのLinuxおよび* nixシステムでエラーなしで同じ方法で実行できます。
多くのシェルおよびコマンドラインツールは、という名前の環境変数を探します$POSIXLY_CORRECT
。設定されている場合、これらのツールはPOSIX互換ツールのように動作します。
もう一つの試みは--posix
フラグです。たとえば、GNUにはすべてのGNU拡張を無効にし、posixのように動作するsed
フラグがあります。--posix
sed
sed
bash
サポート--posix
と$POSIXLY_CORRECT
変数。
このようにスクリプトを作成し、posix互換シェルを使用してテストすると、最高の場所にあります。
答え2
BashはBourne Shellとksh88(いくつかのksh93もあります)機能クローンの混合です。
今日、「シェル」はあまりにも不正確な用語です...
Bashスクリプトは、ベンダーの独自のbash
実装機能を利用するスクリプトです。
移植可能なスクリプトの作成を好む場合は、次の2つのアプローチがあります。
1) POSIX 互換スクリプトを作成しますが、すべてのプラットフォームで POSIX シェルを呼び出す方法を知る必要があります。を呼び出してもPOSIXシェルを取得できません/bin/sh
。 PATHを使用せずにgetconf PATH
then呼び出しの出力にPATHを設定する必要があります。sh
インストールされたスクリプトではこれが役に立たないことがわかります。
2) Bourne Shell と互換性のあるスクリプトを作成します。このスクリプトは、ほぼすべてのシェル(デフォルトではBourne Shellベース)で使用できます。したがって、最小限の機能セットと制限的な仮定に自分自身を制限します。
スクリプトの移植性を確認するには、SYSVr4 Bourne Shell 実装を使用してスクリプトを確認することをお勧めします。 SVr4 Bourne ShellのポータブルバージョンはSchily Tools tarballにあります。
http://sourceforge.net/projects/schilytools/files/
というバイナリをコンパイルして調べますosh
。これはポータブルSVr4 Bourne Shellです。