回答:
いいえ、主にシステムがデフォルトで準拠すること、またはPOSIX標準のみに準拠することを必要としないという理由で(他の標準を除外して)、そうではありません。
たとえば、Solaris(認定準拠システム)は、そのユーティリティの下位互換性を選択しました/bin。これは、それらが不可解な方法で動作する理由を説明し、別の場所にPOSIX準拠のユーティリティを提供します(/usr/xpg4/bin、/usr/xpg6/bin... POSIX)標準に変換され、実際にはSolarisのオプションコンポーネントの一部です)。
でshあることが保証されていません/bin。Solarisでは、/bin/shSolaris 10まではBourneシェル(POSIXに準拠していなかった)でしたが、Solaris 11ではksh93になりました(まだPOSIXに完全に準拠していませんが、実際には/usr/xpg4/bin/sh)
Cからexec*p()、POSIX環境(特にPATH環境変数に関して)を使用していると想定できます。
PATH環境変数を設定することもできます
#define _POSIX_C_SOURCE=200809L /* before any #include */
...
confstr(_CS_PATH, buf, sizeof(buf)); /* maybe append the original
* PATH if need be */
setenv("PATH", buf, 1);
exec*p("ps"...);
または、ビルド時に実行するPOSIXユーティリティのパスを決定することもできます(GNUシステムなどの一部のシステムでは、POSIXLY_CORRECTコンプライアンスを確保するために変数を設定するなどの手順が必要になることに注意してください)。
次のようなことも試してください:
execlp("sh", "sh", "-c", "PATH=`getconf PATH`${PATH+:$PATH};export PATH;"
"unset IFS;shift \"$1\";"
"exec ${1+\"$@\"}", "2", "1", "ps", "-A"...);
shinが$PATHあり、それがBourneのようであり、aがgetconfあり、それがあなたが興味を持っているPOSIXのバージョンのものであることを期待して。
/usr/bin/env存在し、主にPOSIXに準拠していることを祈ります。
/usr/bin/envは、(実際には)よりも移植性の低いハックです/bin/sh。POSIXごと、シェルスクリプトを書くためのポータブルな方法はありません何で#!すべてで。ファイルは実行可能だがENOEXEC(有効なバイナリでexecvpはない)、標準シェルを介して実行することです。:-)もちろん実際にはこれは悪い考えであり、あなたはただ使うべき#!/bin/shです。
$PATHCではなくシェルからの設定を行います。
実際、私は主にyesと答えます。POSIXは以下を保証します:
各ユーティリティがすべてのシステムの特定のディレクトリにあることを必ずしも保証するものではありませんが(/bin/ps)、実行可能ファイルとしてシステムのデフォルトPATHで見つかることが常に保証されます。
確かに、標準でこれを行うための唯一の標準的な指定方法は、経由(Cで)あるunistd.hの_CS_PATH、またはシェルで、の組み合わせを介しcommandやgetconfユーティリティ、すなわち、PATH="$(command -p getconf PATH)" command -v ps常に独特の絶対パスを返す必要がありますPOSIX準拠の特定のシステムで提供されます。それは実装定義であるが、それは、されたシステムのデフォルトのパス変数に含まれている経路、これらUtilitesをは常に必要があり、その中に指定されたパスのいずれかで、利用可能なユニークな、そして準拠します。ps
PATH=$(command -p getconf PATH)は、POSIX環境のPOSIXシェルからのみ機能します。POSIXは、その環境に入る方法を指定せず、文書化するだけです。たとえば、Solarisでは、標準の2つの異なるバージョンに対して異なる値を返すa /usr/xpg4/bin/getconfとa があり、デフォルト値のにも、a もありません。IIRCがXPG4に準拠しているものがあります。/usr/xpg6/bin/getconf_CS_PATH/usr/xpg4/bin/usr/xpg6/bin$PATH/usr/bin/getconf
sh、デフォルトのシェルからPOSIX 。
getconfデフォルト$PATHにコマンドがあるべきだということは何もありません。たとえば、POSIX環境を取得するには、エミュレーションレイヤーを起動する必要があります。エミュレーションレイヤーがなければ、Unixのようなコマンドはまったく実行されません(たとえばWindowsを考えてください)。一度準拠環境にgetconf PATH なれば、$PATH準拠ユーティリティにアクセスできるようになりますが、POSIX環境にいた場合は、おそらく既にそうでした。getconf psが返される場合があることに注意してくださいps。持つps組み込みことは許可されています。
/binすなわち、/bin/ed使用可能でなければなりませんedがインストールされている場合。私は今それを見つけることができませんが、LSBがそれに依存していることを知っています、そしてそれを理論的根拠として使用してバグレポートを成功裏に守ったので、少なくともある時点で真実だったに違いありません。(または、POSuX以外のものであり、私は覚えていませんが、残りは真実です。)