수학 posix 호환에 이중 괄호를 사용하고 있습니까?

수학 posix 호환에 이중 괄호를 사용하고 있습니까?

이 간단한 스크립트는 인터프리터를 사용하여 실행됩니다 /bin/sh.

#!/bin/sh
#!/bin/bash

fac=1

for i in $(seq 1 $1); do
    fac=$((fac*i))
done
echo "The factoriral of $1 is $fac"

$((math))하지만 그것이 존재할 때 왜 작동하는지 알고 싶습니다 . 제 생각에는 이 기능이 /bin/bash유일한 기능은 아닌 것 같습니다 /bin/sh. 그러면 반드시 무슨 일이 일어날까아니요에서 일 /bin/sh하지만 에서 일합니까 /bin/bash?

답변1

$((math expression))기능은 POSIX 기능이며 모든 최신 POSIX 호환 셸에서 지원됩니다.

그러나 POSIX는 경로 이름을 표준화하지 않으므로 POSIX는 이를 "지정되지 않음"이라고 부릅니다./bin/sh

POSIX가 표준화되지 않은 이유는 다음과 같습니다 #! /bin/sh.

일부 UNIX 버전에서는 이전 Bourne Shell을 호출하면 이를 제공합니다 /bin/sh. Solaris-10 이전의 모든 Solaris 버전은 /bin/sh지원되지 않는 이전 Bourne Shell과 함께 제공됩니다 $((math expression)). 이러한 Solaris 버전은 여전히 ​​POSIX 준수 인증을 받았습니다. 다양한 셸 유형(POSIX 또는 비 POSIX)을 사용하는 다른 운영 체제가 있습니다.

예를 들어 Linux에는 일반적 으로 bash또는 . 호출을 허용하는 POSIX 플랫폼을 충족시키기에는 부족한 기본적인 POSIX 호환성만을 제공합니다.dash/bin/shdash유닉스 시스템멀티바이트 문자를 지원하지 않기 때문입니다. bashLinux에서도 완전히 호환되지 않음유닉스 시스템echo시스템(Linux)은 기본적으로 호환되지 않는 내장 기능을 생성하는 방식으로 컴파일됩니다 .

참고: POSIX 인증 플랫폼에서 POSIX 호환 셸을 얻으려면 다음을 호출해야 합니다.

PATH=`getconf PATH`
export PATH
sh

getconf PATH이는 프로그램의 POSIX 호환 변형이 먼저 발견되는 위치에서 PATH 설정을 반환해야 하기 때문에 작동합니다 .

즉, 로 시작하는 쉘 스크립트가 있으면 작동 #!/bin/sh하지 않을 것으로 예상됩니다 . $((math expression))실제로 일어나는 일은 실행 중인 플랫폼에 따라 다릅니다. 쉘이 POSIX와 호환되더라도 작동하려면 C의 기본적인 수학 표현식만 필요합니다. $((i++))예를 들어, POSIX 준수 인증을 받은 쉘에서 작업할 권한이 없습니다.

다음을 실행하여 특정 경로 이름에 실제로 어떤 쉘이 포함되어 있는지 확인할 수 있습니다.

$shell whatshell.sh

whatshell.sh에서 가져옴https://www.in-ulm.de/~mascheck/various/whatshell/

관련 정보