回答:
いいえ、主にシステムがデフォルトで準拠すること、またはPOSIX標準のみに準拠することを必要としないという理由で(他の標準を除外して)、そうではありません。
たとえば、Solaris(認定準拠システム)は、そのユーティリティの下位互換性を選択しました/bin
。これは、それらが不可解な方法で動作する理由を説明し、別の場所にPOSIX準拠のユーティリティを提供します(/usr/xpg4/bin
、/usr/xpg6/bin
... POSIX)標準に変換され、実際にはSolarisのオプションコンポーネントの一部です)。
でsh
あることが保証されていません/bin
。Solarisでは、/bin/sh
Solaris 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"...);
sh
inが$PATH
あり、それがBourneのようであり、aがgetconf
あり、それがあなたが興味を持っているPOSIXのバージョンのものであることを期待して。
/usr/bin/env
存在し、主にPOSIXに準拠していることを祈ります。
/usr/bin/env
は、(実際には)よりも移植性の低いハックです/bin/sh
。POSIXごと、シェルスクリプトを書くためのポータブルな方法はありません何で#!
すべてで。ファイルは実行可能だがENOEXEC
(有効なバイナリでexecvp
はない)、標準シェルを介して実行することです。:-)もちろん実際にはこれは悪い考えであり、あなたはただ使うべき#!/bin/sh
です。
$PATH
Cではなくシェルからの設定を行います。
実際、私は主に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以外のものであり、私は覚えていませんが、残りは真実です。)