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