私は、POSIX準拠のオペレーティングシステム(たとえば、Linux)にsh
シェルが必要であることを読みました。
しかし、sh
が/bin
ディレクトリ、または任意のディレクトリに配置できますか?
POSIXは/dev
および/tmp
ディレクトリの存在を義務付ける 、および/dev/null
、/dev/tty
、および/dev/console
ファイルのみ。標準ユーティリティが存在する必要がありますが、特定の場所は指定されていません。 /bin
がまったく存在しない可能性があります。存在する場合はsh
が含まれていない可能性があり、存在する場合はPOSIX sh
でない可能性があります。
PATH
コマンド を使用して、sh
を含むPOSIXツールを含む有効なgetconf
変数を取得できます。
$ PATH=$(getconf PATH)
$ sh
これは、たとえば、Solarisで役立ちます デフォルトのsh
はPOSIX互換ではありません ですが、準拠するsh
が提供されており、その方法でアクセスできます(なぜなら Solarisは認定されたUnixです )。 getconf PATH
の前部には/usr/xpg4/bin
が含まれます。これにはPOSIX sh
とその他の必要なツールがいくつか含まれます( cd
のような役に立たないツールを含む = )。
いいえ、sh
が/bin
にある必要はありません。可能な場所として/bin
、/usr/bin
、/usr/xpg4/bin
を明示的に引用しています。 POSIX仕様では、sh
がPATHに含まれている必要があります。
POSIX仕様 の状態:
アプリケーションは、シェルへの標準のPATHが
/bin/sh
または/usr/bin/sh
であると想定できないことに注意してください。また、getconf PATHから返されたPATHを調べて、返されたパス名が絶対パスであることを確認してください。シェル組み込みではなくパス名。たとえば、標準のshユーティリティの場所を特定するには、次のようにします。
command -v sh
一部の実装では、これが返される場合があります。
/usr/xpg4/bin/sh
ここの他の人が言ったように、これはPOSIXコンプライアンスに厳密には必要ありません。
しかし、おそらく既存のソフトウェアとの互換性ははるかに重要です(結局のところ、POSIXの目的は、特定のものがすべての準拠オペレーティングシステムで機能するようにすることです)。OSが/bin/sh
でshを提供しない場合、いくつかの問題が発生します。
最も明らかに、#!/bin/sh
を含むスクリプトは、このパスが標準化されていることに依存しています。これは動作する必要はありません。 POSIXでは、#!
行がサポートされている必要はありませんが、そのような機能は一般的であると記載されています :
一部の歴史的な実装がシェルスクリプトを処理する別の方法は、ファイルの最初の2バイトを文字列「#!」として認識することです。そして、ファイルの最初の行の残りの部分を、実行するコマンドインタープリターの名前として使用します。
しかし、それがサポートされていない場合、既存のソフトウェアの多くが機能しなくなるか、移植するために追加の作業が必要になります。