답변:
아니, 그것은 주로 그것을 준수하는 시스템을 필요로하지 않는다는 이유로하지 않습니다 기본적으로 , 또는을 준수하는 경우에만 (다른 표준의 배제) POSIX 표준.
예를 들어, Solaris (인증 된 인증 시스템)는 유틸리티가 이전 버전과 호환 /bin
되는 이유를 설명합니다. 이 유틸리티 는 간결한 방식으로 작동하는 이유를 설명 하고 XPG의 다른 버전 (현재 병합 된)에 대해 별도의 위치 ( /usr/xpg4/bin
, /usr/xpg6/bin
...) 에서 POSIX 호환 유틸리티를 제공합니다. 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
에 $PATH
는 Bourne의이 같은, 또한 거기에 있다는 것을, getconf
그것이 POSIX 당신이있는 거 관심의 버전에 대한 하나있다.
/usr/bin/env
존재하고 대부분 POSIX 호환 기도합니다 .
/usr/bin/env
이다 더 적은 휴대용 (실제로)보다 해킹 /bin/sh
. POSIX 당, 쉘 스크립트를 작성하는 휴대용 방법은 없습니다 더와 #!
전혀 . 파일이 실행 가능하지만 ENOEXEC
유효한 바이너리가 아닌 execvp
경우 표준 셸을 통해 파일을 실행해야합니다. :-) 물론 실제로 이것은 나쁜 생각이므로 그냥 사용해야 #!/bin/sh
합니다.
$PATH
C 대신 쉘에서 설정합니다 .
사실 저는 크게 대답 합니다 . POSIX는 다음을 보장합니다.
각 유틸리티가 모든 시스템 ( /bin/ps
) 의 특정 디렉토리에 있어야 하는 것은 아니지만 반드시 보장됩니다. 시스템 기본 PATH에서 실행 파일로 찾을 수 있음 을 합니다.
실제로, 표준에서이 작업을 수행하는 유일한 표준 지정 방법을 통해 (C에서)이다 unistd.h
의 조합을 통해,의 _CS_PATH 또는 셸에서 ' command
와 getconf
유틸리티, 즉, PATH="$(command -p getconf PATH)" command -v ps
항상 고유의 절대 경로를 반환해야합니다 POSIX 호환을 특정 시스템에 제공됩니다. 즉, 구현 정의 되어있는 동안ps
시스템 기본 PATH 변수에 포함 경로 있지만 이러한 유틸리티 는 항상 지정된 경로 중 하나에서 사용 가능하고 고유하며 호환 가능 해야합니다 .
PATH=$(command -p getconf PATH)
는 POSIX 환경에서 POSIX 쉘에서 것이다에만 작동합니다. POSIX는 해당 환경에 들어가는 방법을 명시하지 않고 문서화 만합니다. 예를 들어, Solaris에는 a /usr/xpg4/bin/getconf
와 a /usr/xpg6/bin/getconf
가 _CS_PATH
있으며 두 개의 서로 다른 표준 버전에 대해 서로 다른 값을 반환 하며 기본값은 도 /usr/xpg4/bin
없습니다 . 있다 IIRC 당신에게 XPG4 적합성을 제공한다. /usr/xpg6/bin
$PATH
/usr/bin/getconf
sh
이는 기본 쉘에서 POSIX 호환 항목이어야 함을 의미합니다. .
getconf
의 기본값 $PATH
에 명령 이 있어야한다는 말이 없습니다 . 예를 들어, POSIX 환경을 얻으려면 에뮬레이션 계층을 시작해야 할 수 있습니다. 그렇지 않으면 유닉스와 같은 명령을 전혀 실행하지 않습니다 (예를 들어 Windows를 생각하십시오). 당신이 준수하는 환경에되면, getconf PATH
당신은 얻을 것이다 $PATH
준수 유틸리티에 도착하지만, 당신이 POSIX 환경에 있다면, 그것은 아마도 이미 사건이었다. 참고 getconf ps
반환 할 수 있습니다 ps
. 갖는 ps
내장하는 것이 허용된다.
/bin
, 즉/bin/ed
사용할 수 있어야합니다 ed가 설치된 경우. 지금은 그것을 찾을 수 없지만 LSB가 그것에 의존한다는 것을 알고 있으며 그것을 근거로 버그 보고서를 성공적으로 방어했습니다. 그래서 적어도 어느 정도는 사실이어야합니다. (또는 POSuX가 아닌 다른 것이 었으므로 기억 나지만 나머지는 사실입니다.)