sh가 bash 또는 dash에 대한 심볼릭 링크인 경우 bash는 POSIX 준수로 제한되므로 sh와 100% 호환되어야 합니까?

sh가 bash 또는 dash에 대한 심볼릭 링크인 경우 bash는 POSIX 준수로 제한되므로 sh와 100% 호환되어야 합니까?

~에서bash와 sh의 차이점:

질문에 대답하려면: /bin/shas에서 bash로의 링크가 있는 경우 bash는 /bin/sh호출될 때와 호출될 때 동일하게 작동 하지 않습니다 /bin/bash. 호출되면 sh제한된 확장 세트를 사용하여 주로 POSIX 호환으로 제한됩니다.

이것은 Linux에서 sh:라는 쉘 스크립트가 있는 쉘 스크립트를 만날 때 #!/bin/sh마다 dash 또는 bash와 같은 다른 쉘에 대한 심볼릭 링크인 해당 배포판에서도 bin/shBourne 쉘과 100% 호환 가능해야 한다는 것을 의미합니까? 제한된 확장 세트로 제한됩니까? 그러면 FreeBSD에서 실행할 수 있나요? 예외가 있나요? 아니면 그것이 효과가 있을 것이라고 안전하게 가정할 수 있어야 합니까?

따라서 배포판에서 bin/sh예, 심볼릭 링크가 bin/bash사용되고 #!/bin/sh스크립트에 bashism이 포함되어 있으면 bash가 sh 모드에 있기 때문에 실행되지 않습니까?

답변1

아니요, /bin/shbash는 bash에 대한 심볼릭 링크인 경우에만 posix 모드로 들어갑니다.남자 난교:

sh로 호출되면 bash는 시작 파일을 읽은 후 posix 모드로 들어갑니다.

이제 posix 패턴을 검색하면배쉬 맨페이지일부 쉘 내장 기능은 유사 time하거나 source다르게 작동한다는 것을 알 수 있습니다. 그게 다야. function함수를 선언하기 전에 작성하거나 source대신 사용하는 것과 같은 Bashish는 .작동할 수 있지만 명령은 다르게 작동할 수 있습니다.

따라서 /bin/sh모든 일반적인 bashishm에 대한 심볼릭 링크는 여전히 작동합니다./bin/bash

Posix 모드 차이점에 대한 상당히 광범위한 목록을 보려면 다음을 확인하세요.배쉬 참조 매뉴얼.

답변2

Bourne 쉘은 약간 혼란스러워 보입니다. Bourne 쉘은 POSIX 이전 수십 년 전의 Unix 쉘입니다. 오늘날 "sh"는 bash, pdksh, AT&T ksh, 최신 Almquist 쉘 및 POSIX 호환 파생물(일부 BSD "sh" 포함), 기타 BSD sh 기반을 포함하여 POSIX 사양을 구현하는 하나 이상의 쉘 구현입니다. pdksh 및 Debian ash(대시) - 예: Ubuntu). 심지어 zsh에도 대부분 POSIX 호환 모드가 있습니다. 다음을 실행하여 확인할 수 있습니다.

# check what sh really is on Ubuntu 22.04
$ ls -nd -- /bin/sh
lrwxrwxrwx 1 0 0 4 Mar 23  2022 /bin/sh -> dash

Bourne 쉘은 POSIX와 호환되지 않으며 오늘날 많은 시스템에서 찾을 수 없습니다. Bourne 쉘이 발견되든 없든 항상 POSIX 호환 "sh"가 있습니다(Bourne 쉘은 아닙니다). 단, /bin주목할만한(그리고 짜증나는) Solaris 예외는 없습니다.

Bourne 쉘 이전에는 30년 전에 "sh"가 Thompson 쉘이었습니다. 우리는 더 이상 Thompson 셸과 호환되는 스크립트를 작성하지 않습니다. 마찬가지로 "sh"를 Bourne 쉘로 생각하는 것을 멈춰야 합니다.

오늘날 "sh"는 때때로 호환되지 않는 다양한 구현 변형이 아닌 사양입니다. 이렇게 하면 이식 가능한 스크립트를 훨씬 쉽게 작성할 수 있습니다. 그냥 따라 가라사양.

이는 "sh" 및 모든 표준 유틸리티(sed, cut, tr...)에서 작동합니다.

관련 정보