bash가 이름으로 호출되면 sh다음을 수행합니다 .
if (shell_name[0] == 's' && shell_name[1] == 'h' && shell_name[2] == '\0')
act_like_sh++;
그런 다음 나중에 쉘 변수를 다음과 같이 설정합니다POSIXLY_CORRECTy .
if (act_like_sh)
{
bind_variable ("POSIXLY_CORRECT", "y", 0);
sv_strict_posix ("POSIXLY_CORRECT");
}
bind_variable통화 bind_variable_internal, 어떤 쉘 속성은 경우 a(당신이 쉘을 호출하는 경우가 될 것이라고시에있다 -a), 마르크로 쉘 변수 에 수출 .
첫 번째 스크립트에서 :
#!/bin/sh -a
echo "a" | sed -e 's/[\d001-\d008]//g'
sedPOSIXLY_CORRECT=y환경에서 호출되어 에 대해 불평하게됩니다 [\d001-\d008]. (sed에 --posix옵션 이 주어지면 같은 일이 일어난다 .)
GNU가 나오지에서 수치의 문자 이스케이프 코드베이스는 10이다 NNN 하지만 POSIX 모드에서는이 때문에, 브래킷 식 내부 비활성화 , 문자 적 캐릭터 , 범위에서 주도로 등 에 . 문자 코드 순서대로 앞에옵니다 (범위에는 0을 제외한 모든 숫자와 모든 대문자 및 일부 특수 문자가 포함됨). 그러나 사용중인 로캘 에서을 정렬하기 전에 범위가 유효하지 않습니다.\dNNN[\d001-\d008]\d1\1\en_US.UTF-8\1
두 번째 스크립트에서 :
#!/bin/sh
set -a
echo "a" | sed -e 's/[\d001-\d008]//g'
POSIXLY_CORRECT쉘에 설정되어 있어도 익스포트되지 않으므로 sed는 POSIXLY_CORRECT환경 없이 호출 되며 sed는 GNU 확장으로 실행됩니다.
export POSIXLY_CORRECT두 번째 스크립트 상단 근처에 추가 하면 sed 불평도 표시됩니다.
sh같은 것은 아닙니다 . 모든 sed도 동일하지 않습니다. 어느sh것을 사용하고 있습니까? 어느 OS에서? 그리고 어느 sed (sed --version실패하지 않습니까?)