あなただけを使用する必要があります#! /bin/sh
。
シェルスクリプトでbash(またはzsh、またはfish、...)拡張機能を使用しないでください。
シェル言語のすべての実装(シェル自体に付随するすべての「ユーティリティ」プログラムを含む)で動作するシェルスクリプトのみを記述してください。これらの日、あなたはすることができますおそらく取るPOSIX.1-2001(ないシェルとユーティリティがすることができ、何のために権威として-2008)をしていますが、(例えばSolarisのポートにするとレガシーシステムへのスクリプトを1日と呼ばれることもあることに注意してくださいまたはAIX)シェルおよびユーティリティが1992年頃に凍結された。
まじで?
はい、真剣に。
事はここにあります:シェルはひどいプログラミング言語です。唯一の目的/bin/sh
は、すべての Unixインストールで保証されている唯一のスクリプトインタープリターであることです。
ここでは、他のことだ:コアのPerl 5インタプリタのいくつかの反復は(/usr/bin/perl
)である以上よりも、ランダムに選択されたUnixのインストールで利用可能である可能性が高い(/(usr|opt)(/(local|sfw|pkg)?)?/bin/bash
です。他の優れたスクリプト言語(Python、Ruby、node.jsなど—シェルと比較する場合、そのカテゴリにPHPとTclを含めます)も、bashやその他の拡張シェルとほぼ同じくらい利用可能です。
したがって、bashスクリプトを作成するオプションがある場合は、代わりにひどくないプログラミング言語を使用するオプションがあります。
さて、単純なシェルスクリプト、つまりcronジョブなどからシーケンスでいくつかのプログラムを実行するだけの種類のスクリプトは、シェルスクリプトのままにしておくことで問題はありません。ただし、単純なシェルスクリプトには、配列や関数は必要ありません[[
。また、他に選択肢がない場合にのみ、複雑なシェルスクリプトを記述する必要があります。たとえば、Autoconfスクリプトは適切なシェルスクリプトです。ただし、これらのスクリプトは、構成中のプログラムに関連するすべてのインカネーションで実行/bin/sh
する必要があります。つまり、拡張機能は使用できません。最近の古いプロプライエタリUnixを気にする必要はないでしょうが、おそらく現在インストールされていないオープンソースBSD を気にする必要があります。bash
デフォルトでは、最小限のシェルとのみを提供する組み込み環境busybox
。
結論として、ポータブルシェル言語では使用できない機能を望んでいることに気付いた瞬間、つまり、スクリプトが複雑すぎてシェルスクリプトを維持できないという兆候です。代わりに、より良い言語で書き直してください。
bash
関数と構文ではなく関数と構文を使用している場合sh
。