GNU/Linux >> Linux の 問題 >  >> Linux

#!/bin/bash と #!/bin/sh はいつ使用する必要がありますか?

要するに:

  • 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 のみを提供する組み込み環境 .

結論として、欲しいと思った瞬間に 移植可能なシェル言語では利用できない機能です。これは、スクリプトが複雑になりすぎてシェル スクリプトであり続けることができないことを示しています。代わりにより良い言語で書き直してください。


Linux
  1. / usr/binと/usr/ local / bin Linuxの場合?

  2. Linux – / usr/binと/usr/sbinを/bin(gnu / linux)にマージしますか?

  3. nologin ユーザーのシェルとしての /bin/false と /sbin/nologin の違い

  1. バイナリを /bin、/sbin、/usr/bin、および /usr/sbin にインストールし、 --prefix および DESTDIR と対話します

  2. #!/usr/bin/env bash と #!/usr/bin/bash の違いは何ですか?

  3. cmake --version は /usr/bin/cmake を指し、どの cmake は /usr/local/bin を指しますか

  1. Linuxは複数の連続したパスセパレーター(/ home //// username /// file)をどのように処理しますか?

  2. /dev/shm/ と /tmp/ はいつ使用する必要がありますか?

  3. /bin の内容を /usr/bin に移動しました。元に戻すことはできますか?