이 간단한 스크립트는 인터프리터를 사용하여 실행됩니다 /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/sh
dash
유닉스 시스템멀티바이트 문자를 지원하지 않기 때문입니다. bash
Linux에서도 완전히 호환되지 않음유닉스 시스템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/