"sh"は "/bin"ディレクトリになければなりませんか?

"sh"は "/bin"ディレクトリになければなりませんか?

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

しかし、ディレクトリshに存在する必要がありますか、それともどのディレクトリにも存在できますか?/bin

答え1

POSIXは強制ディレクトリ/dev/tmpディレクトリのみ存在します。、、、、/dev/nullおよびファイル/dev/tty/dev/console標準ユーティリティが必要ですが、特定の場所は指定されません。 aはまったく存在しない場合もあれば/bin、含まれていない場合もありsh、存在する場合はPOSIXではない場合がありますsh

以下を使用して、PATHPOSIXツール(含む)で有効な変数を取得できます。shgetconf注文する:

$ PATH=$(getconf PATH)
$ sh

これは、たとえば次のようなSolarisで役立ちます。デフォルトは POSIX と互換性shがありません。shしかし、この方法でコンプライアンスとアクセスを提供します(なぜならSolarisは認証されたUnixです。)。 POSIXやgetconf PATH他の多くの必須ツール(/usr/xpg4/binsh次のような役に立たないものを含めてください。cd)。

答え2

shいいえ。サインアップする必要はありません/bin/bin/usr/binおよび/usr/xpg4/bin可能な場所を明示的に参照してください。 POSIX 仕様では PATH のみにしてくださいsh

これPOSIX仕様状態:

/bin/shアプリケーションは、シェルの標準PATHを想定することはできず、/usr/bin/shgetconf PATHによって返されたPATHを調べて決定し、返されたパス名がシェル組み込みパス名ではなく絶対パス名であることを確認する必要があることを認識する必要があります。

たとえば、標準のshユーティリティの場所を確認するには、次のようにします。

command -v sh

一部の実装では、以下が返されることがあります。

/usr/xpg4/bin/sh

答え3

他の人が言ったように、これはPOSIX準拠の厳しい要件ではありません。

しかし、既存のソフトウェアとの互換性は間違いなくはるかに重要であり(最終的にPOSIXのポイントはすべての標準互換オペレーティングシステムで特定の機能を実行することです)、OSがshを提供しないと/bin/sh一部の機能が中断されます。

最も明白なのは、スクリプトが#!/bin/shこの標準化されたパスに依存していることです。これはタスクには必要ありません。#!POSIXはこれらの機能が一般的であると言いますが、行のサポートも必要ありません。:

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

しかし、サポートがなければ、多くの既存のソフトウェアが機能しないか、移植のために追加の作業が必要です。

関連情報