シェルに関して通常使用される「sh互換」というフレーズを見てきました。シェル内から実行される可能性のあるプログラムにも当てはまるかどうかはわかりません。
シェルまたは他のプログラムが「sh互換」であるとはどういう意味ですか? 「sh互換性がない」とはどういう意味ですか?
編集:bashとshの違いを尋ねるこの質問は非常に関連しています: shとbashの違い
「sh互換」であるとはどういう意味かについて、直接的な回答を希望します。 「sh互換」は「シェルコマンド言語を実装する」という意味であると合理的に予想されますが、「sh互換」シェルが非常に多いのはなぜですか、なぜ違うのですか。
「sh互換」とは、すべての互換性のあるシステムに存在する必要がある基本的なシェル POSIX sh
を指します。 sh互換のスクリプトは、POSIX互換のマシンで動作するはずです。
そう言う必要がある理由は、一般的に_/bin/sh
_は_/bin/bash
_へのシンボリックリンクであるため、_#!/bin/sh
_でsh
を使用することを宣言するスクリプトに一部のバシズムが入り込んでいるためです。これらのスクリプトは、bash
を_/bin/sh
_として使用しないシステムでは機能しません。これには、いくつかの商用Unicesが永久に含まれるほか、最近 Debian および derivatives が含まれます。
特に、Debian Almquishシェルである dash
は、最近ではデフォルトでsh
として使用される傾向にあります。その傾向は、想定されるsh
スクリプトに含まれていたバシズムの多くを強調しています。何かを「sh互換」と記述すると、完全に POSIXで指定された言語 内に留まることによってこれらのシステムで動作することを明示的に意図していることを示します。すべてのシェルはその機能のスーパーセットを実装するため、どこでも動作することが保証されます、しかしそれらの拡張は互いに互換性がありません。
さまざまなシェルには独自の開発履歴があり、ユーザーがインタラクティブに使用できるように機能を追加したり、連想配列などのスクリプト拡張機能を追加したりして、時間の経過とともにさまざまな方向に分岐しました。 「sh互換性のない」スクリプトは、Bashの_[[
_条件など、これらの非標準の拡張機能の一部を使用します。
bash
、tcsh
、zsh
、およびその他の現在のすべてのシェルのPOSIX以外の機能は便利です。それらが必要です。これらは、_/bin/sh
_で動作することを宣言するスクリプトでは使用しないでください。これらの機能が、実行中のシステムの基本的なsh
実装にあることを信頼できないためです。
たとえば、連想配列を使用する必要があるスクリプトは、bash
ではなくsh
で実行する必要があります。
_#!/bin/bash
declare -A array
_
これは、bash
があればどこでも機能します。拡張機能を必要とせず、移植可能なスクリプトは、sh
を使用することを宣言し、基本のシェルコマンド言語を使用する必要があります。