要するに:
-
POSIX sh 仕様のスーパーセットを実装するシェルがいくつかあります。異なるシステムでは、
06
ash、bash、dash、ksh、zsh、&c へのリンクである可能性があります。 (ただし、常に sh と互換性があります。csh や fish ではありません。) -
14
に固執する限り22
を使用できます (おそらく使用する必要があります)。 どのシェルであっても、スクリプトは問題なく動作するはずです。 -
bash 固有の機能 (配列など) の使用を開始する場合は、bash を具体的に要求する必要があります。 すでに your で bash を呼び出しています システム、それは他のすべてのではないかもしれません システムであり、スクリプトはそこで実行されません。 (もちろん、同じことが zsh と ksh にも当てはまります。) shellcheck を使用して、バシズムを識別できます。
-
スクリプトが個人的な使用のみを目的としている場合でも、OS によっては
47
が変更されることがあります。 アップグレード中 – 例:Debian では以前は bash でしたが、後に非常に最小限のダッシュに置き換えられました。バシズムを使用したが53
を使用したスクリプト 突然壊れた。
ただし:
-
63
でも はあまり正しくありません。異なるシステムでは、bash は71
にある可能性があります または88
または93
. -
より信頼できるオプションは
108
です 、これは $PATH を使用します。 (110
ツール自体も厳密には保証されていません123
139
よりも多くのシステムでまだ動作します )
スクリプトの開発とデバッグに実際に使用したシェルに対応するシバンを使用します。つまりログイン シェルが 143
の場合 、およびターミナルでスクリプトを実行可能ファイルとして実行するには、 150
を使用します .配列を使用したことがないので (または 161
知っている機能)、好きなシェルを選んでも安全です。シェル間には多くの微妙な違いがあります (176
、関数、ループなど) は、適切なテストなしでは発見できません。
これを考慮してください:183
を離れる場合 ユーザーがそれを持っていない場合、
Error: /bin/bash not found
ほとんどのユーザーは、適切なパッケージをインストールすることで、1 分以内にこれを修正できます。一方、シバンを 193
に置き換えると、 202
のシステムでテストします 215
へのシンボリックリンクです 、225
を持っていないユーザー 困るでしょう。ほとんどの場合、次のような不可解なエラー メッセージが表示されます:
Error in script.sh line 123: error parsing token xyz
これを修正するには何時間もかかる可能性があり、どのシェルを使用する必要があったかについての手掛かりがありません。
シバンで別のシェルを使用したい理由はあまりありません。理由の 1 つは、使用したシェルが普及していない場合です。もう 1 つは、239
でパフォーマンスを向上させることです。 これは一部のシステムでは大幅に高速であり、スクリプトがパフォーマンスのボトルネックになります。その場合は、ターゲット シェルでスクリプトを徹底的にテストしてから、シバンを変更してください。
243
のみを使用する必要があります .
シェル スクリプトで bash (または zsh、fish、または ...) 拡張機能を使用しないでください。
any で動作するシェル スクリプトのみを作成する必要があります。 シェル言語の実装 (シェル自体に付随するすべての「ユーティリティ」プログラムを含む)。最近では、おそらくできる POSIX.1-2001 を使用 (しない -2008) は、シェルとユーティリティの機能については信頼できるものですが、シェルとユーティリティが 1992 年頃に凍結されたレガシー システム (Solaris や AIX など) にスクリプトを移植するように求められる可能性があることに注意してください。
何、マジで?!
はい、真剣です。
ここに問題があります:シェルはひどい プログラミング言語。それが行っている唯一のことは、258
唯一無二のスクリプト インタープリタです。すべての Unix のインストールは保証されています。
もう 1 つ:コア Perl 5 インタープリターの繰り返し (269
) ) は 多い 278
よりランダムに選択された Unix インストールで利用できる可能性が高い は。他の優れたスクリプト言語 (Python、Ruby、node.js など — シェルと比較する場合、PHP と Tcl もそのカテゴリに含めます) も、bash やその他の拡張シェルとほぼ同じくらい利用できます。
したがって、bash スクリプトを作成するオプションがある場合は、代わりに悪くないプログラミング言語を使用するオプションがあります.
さて、シンプル シェル スクリプトは、cron ジョブなどからいくつかのプログラムを順番に実行するだけのものであり、それらをシェル スクリプトのままにしておくことには何の問題もありません。しかし、単純なシェル スクリプトには、配列や関数、または 281
は必要ありません。 平。そして、複雑とだけ書くべきです 他に選択肢がない場合は、シェルスクリプトを使用してください。たとえば、Autoconf スクリプトはシェル スクリプトのままです。ただし、これらのスクリプトはすべてで実行する必要があります 291
の化身 これは、構成されているプログラムに関連しています。つまり、拡張機能を使用できないということです。おそらく、最近は古いプロプライエタリな Unix を気にする必要はありませんが、おそらく すべき 304
をインストールしないものもある、現在のオープンソース BSD に注意してください デフォルトでは、最小限のシェルと 318
のみを提供する組み込み環境 .
結論として、欲しいと思った瞬間に 移植可能なシェル言語では利用できない機能です。これは、スクリプトが複雑になりすぎてシェル スクリプトであり続けることができないことを示しています。代わりにより良い言語で書き直してください。