“sh”가“/ bin”디렉토리에 있어야합니까?


16

POSIX 호환 운영 체제 (예 : Linux)에 sh셸이 있어야한다는 것을 읽었습니다 .

그러나 필요 sh에 있어야하는 /bin디렉토리, 또는 임의의 디렉토리에있을 수 있습니까?


/bin/sh대부분의 경우 리눅스에서는 symlink를 항상 symlink로 사용할 수 있습니다 bash. 단지 많은 스크립트가 하드 코딩 된 것을 사용합니다/bin/sh
cylgalad

5
이제 원하는 곳 어디에서나 살 수 있다는 대답을 얻었으므로 스스로에게 물을 수 있습니다 sh. 그리고 답은 : shebang도 POSIX의 일부가 아니기 때문에 문제 자체도 나타나지 않습니다.
Jörg W Mittag

1
@ JörgWMittag 그렇습니다. POSIX에서 "표준"유닉스 기능으로 생각할 수있는 것들이 실제로 얼마나 많은지 궁금합니다.
Barmar

1
shebang 사용 여부 /bin/sh는 POSIX 시스템에 경로 가 존재 해야하는지 여부와 무관 합니다.
chepner

적어도 우분투에서 파생 된 시스템에서는 /bin/sh에 대한 링크 dash입니다. BSD에서는 /bin/sh링크가 아니라 별도의 실행 파일이며 확실히 아닙니다 bash.
Rhialto는 Monica

답변:


22

POSIX 만 의무화 /dev하고 /tmp존재하는 디렉토리를 하고 /dev/null, /dev/tty/dev/console파일. 표준 유틸리티가 존재해야하지만 지정된 특정 위치가 없습니다. 이 없을 수도 있고, /bin이 포함되어 sh있으면 POSIX가 아닐 수도 있습니다 sh.

다음 명령을PATH 사용하여 POSIX 도구를 포함 하는 유효한 변수를 얻을 수 있습니다 .shgetconf

$ PATH=$(getconf PATH)
$ sh

예를 들어, 기본값 sh은 POSIX와 호환되지 않지만 Solaris가 인증 된 Unixsh 이기 때문에 호환 되는 방식으로 제공되고 액세스 가능한 Solaris에서 유용 할 수 있습니다 . 포함 POSIX 포함 전면에서 와 (기타 필요한 도구의 수 와 같은 쓸모없는 사람을 포함하여 ).getconf PATH/usr/xpg4/binshcd


Solaris 다시 : ... 많은 POSIX 도구가없는 Solaris "소규모 서버"설치를 실행하지 않는 한. 참조 unix.stackexchange.com/q/360359/135943
와일드 카드

"무용지물"? 차라리 그들을 중복이라고 부릅니다.
Mukesh Sai Kumar

2
getconf는 어떻게 찾습니까?
Joshua

@MukeshSaiKumar 독립형 'cd'명령은 작동하지 않습니다
OrangeDog

예를 들어, 디렉토리로 변경할 있는지 여부를 테스트 하지만 실제로는 디렉토리를 호출 한 프로세스를 떠나지 않는 작업 값에 대해서만 "작동"합니다 . 그래도 그 어느 것보다 더 많은 기능입니다.
Charles Duffy

12

아니, 그것은 필요하지 않습니다 sh에 있어야하는 /bin. 그것은 명시 적으로 인용 /bin, /usr/bin/usr/xpg4/bin가능한 위치로. POSIX 스펙 sh은 PATH에 있어야합니다 .

POSIX 사양 상태 :

응용 프로그램은 쉘에 대한 표준 PATH는 /bin/sh또는 로 간주 될 수 없으며 /usr/bin/shgetconf PATH에 의해 리턴 된 PATH의 조사에 의해 판별되어 리턴 된 경로 이름이 쉘 내장이 아닌 절대 경로 이름인지 확인해야합니다.

예를 들어, 표준 sh 유틸리티의 위치를 ​​판별하려면 다음을 수행하십시오.

command -v sh

일부 구현에서는 다음이 반환 될 수 있습니다.

/usr/xpg4/bin/sh


2

다른 사람들이 말했듯이 POSIX 준수를 위해 꼭 필요한 것은 아닙니다.

그러나 기존 소프트웨어와의 호환성이 훨씬 더 중요합니다 (결국 POSIX의 목적은 모든 운영 체제에서 작동 /bin/sh하는 것입니다).

가장 분명하게, #!/bin/sh이 경로에 의존하는 스크립트 는 표준화되고 있습니다. 작동하지 않아도됩니다. POSIX는 #!이러한 기능이 일반적이라고 언급하지만 라인을 지원할 필요조차 없습니다 .

일부 역사적 구현에서 쉘 스크립트를 처리하는 다른 방법은 파일의 처음 2 바이트를 문자열 "#!"로 인식하는 것입니다. 및 파일의 첫 번째 라인의 나머지를 실행할 명령 인터프리터의 이름으로 사용하는 단계를 포함한다.

그러나 이것이 지원되지 않으면 많은 기존 소프트웨어가 중단되거나 추가 작업이 필요합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.