web-dev-qa-db-ja.com

「sh」は「/ bin」ディレクトリにある必要がありますか?

私は、POSIX準拠のオペレーティングシステム(たとえば、Linux)にshシェルが必要であることを読みました。

しかし、sh/binディレクトリ、または任意のディレクトリに配置できますか?

16
user270294

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のような役に立たないツールを含む = )。

22
Michael Homer

いいえ、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

12
John1024

ここの他の人が言ったように、これはPOSIXコンプライアンスに厳密には必要ありません。

しかし、おそらく既存のソフトウェアとの互換性ははるかに重要です(結局のところ、POSIXの目的は、特定のものがすべての準拠オペレーティングシステムで機能するようにすることです)。OSが/bin/shでshを提供しない場合、いくつかの問題が発生します。

最も明らかに、#!/bin/shを含むスクリプトは、このパスが標準化されていることに依存しています。これは動作する必要はありません。 POSIXでは、#!行がサポートされている必要はありませんが、そのような機能は一般的であると記載されています

一部の歴史的な実装がシェルスクリプトを処理する別の方法は、ファイルの最初の2バイトを文字列「#!」として認識することです。そして、ファイルの最初の行の残りの部分を、実行するコマンドインタープリターの名前として使用します。

しかし、それがサポートされていない場合、既存のソフトウェアの多くが機能しなくなるか、移植するために追加の作業が必要になります。

2
Ian D. Scott