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에서 유용합니다.기본값은 sh
POSIX와 호환되지 않습니다.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바이트를 "#!" 문자열로 인식하고 파일의 첫 번째 줄의 나머지 부분을 실행할 명령 해석기의 이름으로 사용하는 것이었습니다.
그러나 지원이 없으면 많은 기존 소프트웨어가 작동하지 않거나 이식을 위해 추가 작업이 필요합니다.