web-dev-qa-db-ja.com

Bashismsの問題は何ですか?

「バシズム」とは、bashシェルのみが理解し、他のシェルは理解しないシェル構文を意味します。

/bin/bashが存在する環境でのみ実行されるスクリプトを作成する場合、Bashismを回避することは無意味で時間を浪費すると思いますが、何かが足りないかもしれません。

Bashでのみ使用可能な機能を使用できる場合、より簡単なソリューションがある場合、より複雑な方法でスクリプトを作成することの利点は何ですか?

次の質問があります: bash vs dashの速度について具体的な数字はありますか?

ここで結論を発表しました: https://github.com/guettli/programming-guidelines/blob/master/README.rst#portable-Shell-scripts

4
guettli

まず、移植性。スクリプトを使用するすべての場所でbash(できれば同じまたはより新しい)バージョンが確実である場合、何も問題はありません。 Ubuntu以外のUnixライクなOSでソフトウェアが使用されることを期待する開発者またはシステム管理者であり、bashがある場合とない場合、bashismsは/bin/shによって理解されません。

第二に、POSIX準拠。 OSまたはプロジェクトの一部として含めるスクリプトを作成して送信する場合、多くの場合、/bin/sh構文にする必要があります。これは基本的にPOSIX標準です。パフォーマンス上の理由から/bin/shが好まれることが多いため、シェルスクリプトで速度が必要な場合は、bashism、したがってbashを避ける必要があります。

要するに、バシズムは悪くない。それは本当にあなたがスクリプトを書くコンテキストに依存します。 bashが確実に利用可能であり、あまり古くない場合は、すべての手段で機能を使用します-それらは理由があります。

11

そのため、Bash固有の機能を使用していることがわかっていて、#!/bin/bashがBashであると想定する代わりに/bin/sh hashbangを使用することを忘れないでください。

Ubuntu(およびDebian)では、#!/bin/shスクリプトの「bashisms」は、デフォルトの/bin/shが以前のようにBashではなくDashに変更された場合にほとんど問題になりました(Ubuntuの DashAsBinShを参照) wiki )。 /bin/shで実行されるすべてのスクリプトは、bashismsをチェックし、Dashがサポートする標準機能を使用するように修正する必要がありました。変更は、Bashの可用性に関するものではなく(依然としてEssentialパッケージであるため、常にインストールされます)、速度に関するものです。systemdの前に、起動プロセスは多数のシェルスクリプトを生成し、デフォルトのシェルを実際により速い影響がありました。

他のシステムでは、/bin/shは依然としてBashである可能性があり、#!/bin/shでマークされたスクリプトでBash固有の機能を誤って使用する可能性があります。 shがBashでないシステムでは、これらは直接動作しません。次に、Bashがまったくないシステムがあります。多くの場合、組み込みシステムにはBusybox Shellしかありません。 Linux以外のUnixenにはBashがない場合がありますが、多くの場合、Bashの機能の多くはkshのバージョンがあります。ただし、1対1の互換性はありません。

Bashの非標準機能の一部は非常に便利です(例 arrays 、部分文字列スライス(${var:n:m}) 、テキスト置換(${var/foo/bar}))であるため、スクリプトを記述しやすくする場合は、必ずBashを使用してください。

とは言っても、直接標準的な同等物を持ついくつかのバシズムがあります。つまり、非標準のバリアントを使用する理由はほとんどないか、まったくありません。頭に浮かぶもの:

  • ==[ .. ]演算子は非標準ですが、標準の=演算子と同等です
  • function f { ... }f() { ... }はBashでは同等ですが、前者は非標準です。 (違いがあるkshからのものです。)
  • $((--n))は非標準ですが、$((n=n-1))に置き換えることができます
  • 簡単な場合は、[[ ... ]]を標準の[ .. ]に置き換えることができます
6
ilkkachu