`var=valuebuiltin`은 `var=value;와 동일합니까? 내장 `?

`var=valuebuiltin`은 `var=value;와 동일합니까? 내장 `?

존재하다내 대답은 여기에 있다, 다음 구조를 사용했습니다.

n=$1 shift

읽다토큰 인식 사양, 나는 쉘이 행을 변수 할당 n=$1과 내장 명령의 두 부분으로 구문 분석한다는 것을 알고 있습니다 shift.

하지만내 답변에 대한 의견일부 쉘에서는 상태가 n=$1 shift실패합니다.

나는 빠른 확인을 했다:

$ for shell in /bin/*[^c]sh; do
  printf '=%-17s=\n' "$shell"
  "$shell" -c 'a=$1 shift; echo "$a"' "$shell" 1
done
=/bin/ash         =
1
=/bin/bash        =

=/bin/dash        =
1
=/bin/heirloom-sh =
1
=/bin/ksh         =
1
=/bin/lksh        =
1
=/bin/mksh        =
1
=/bin/pdksh       =
1
=/bin/posh        =
1
=/bin/schily-osh  =
1
=/bin/schily-sh   =
1
=/bin/yash        =
1
=/bin/zsh         =

bash를 제외한 모든 쉘이 zsh작동합니다 . 하지만 모드와 시뮬레이션 bash에서는 작동합니다 .posixzshsh

$ ARGV0=sh bash -c 'a=$1 shift; echo "$a"' sh 1
1
$ ARGV0=sh zsh -c 'a=$1 shift; echo "$a"' sh 1 
1

var=value; shift모든 쉘에서 사용 가능합니다.

그렇다면 이러한 구조는 POSIX 호환 쉘에서 동일합니까?

답변1

Bourne Shell에서 내장 명령 이전의 모든 유형의 변수 할당은 전체 쉘에 영향을 미칩니다.

David Korn은 히스토리 편집이 추가되기 전에 많은 내장 기능을 갖춘 향상된 Bourne Shell을 만들기 시작했기 때문에 이 동작은 그에게 분명히 문제였습니다.

결과적으로 ksh88은 다르게 동작하며 이 동작은 최신 POSIX 표준을 지배하게 되었습니다.

현재 규칙은 다음과 같습니다.

  • VAR=valuea가 special builtin전체 쉘에 영향을 미치기 전에

  • VAR=value이것이 내장 명령이더라도 다른 명령은 이 명령에만 영향을 미칩니다.

당신의 실수는 special builtin.

특별한 내장 함수 목록을 얻으려면 예를 들어 builtin -s을 호출 할 수 있습니다 Schily Bourne Shell.

다른 내장 함수(예: 명령 사용)를 사용하여 테스트하는 경우 cd기존 Bourne Shell에서 테스트를 실행할 때만 변수 할당이 명령에 보존되므로 다른 결과가 표시됩니다.cd

그러나 POSIX는 환경을 유지하기 위해 쉘을 허용하지만 필요하지는 않습니다 special builtins. 모든 내장 함수(특수 내장 함수 포함)에 대해 동일한 동작을 원하는 경우 내장 함수 이름 앞에 를 붙일 수 있습니다 command.

관련 정보