POSIX 셸의 함수와 변수에 대한 별도의 네임스페이스

POSIX 셸의 함수와 변수에 대한 별도의 네임스페이스

대시에서는 함수와 변수가 서로 다른 네임스페이스에 있는 것으로 나타납니다.

fn(){
    fn="hello world"
}
fn; echo "The value is $fn!" #prints: The value is hello world!
fn; echo "The value is $fn!" #prints: The value is hello world!
#the fn variable doesn't conflict with the fn function

이것은 대시 특정 기능입니까, 아니면 POSIX 보장입니까?

답변1

보증:

2.9.5 기능 정의 명령

함수는 새로운 위치 인수를 사용하여 복합 명령을 호출하기 위해 간단한 명령으로 사용되는 사용자 정의 이름입니다. 기능은 "기능 정의 명령"을 통해 정의됩니다.[...]

함수 이름은 fname입니다. 응용 프로그램에서는 이 이름이 특수 내장 유틸리티의 이름이 아니라 이름(XBD 이름 참조)인지 확인해야 합니다. 구현 시 함수 이름에 확장자로 추가 문자를 허용할 수 있습니다(MAY).구현에서는 함수와 변수에 대해 별도의 네임스페이스를 유지해야 합니다.

답변2

변수와 함수는 대시의 서로 다른 네임스페이스에 있으며, 이는 다음과 같이 표시됩니다.POSIX:

구현에서는 함수와 변수에 대해 별도의 네임스페이스를 유지해야 합니다.

또한 변수에는 기본적으로 전역 범위가 있습니다. 일부 셸(예: bash, ksh 및 zsh)은 local로컬 범위만 갖는 함수에서 변수를 선언하는 키워드를 제공합니다.

그렇습니다. 현재 보고 있는 동작은 POSIX에 의해 보장됩니다.

아직 POSIX가 아님표준화 local,하지만:

이전 제안의 함수 설명은 함수가 작은 쉘 스크립트처럼 실행되어야 한다는 개념을 기반으로 했습니다.공유변수를 제외하고, 실행 환경의 대부분의 요소는 새로운 실행 환경처럼 동작해야 합니다. [..]

[..] 함수 내의 지역 변수가 고려되어 또 다른 초기 제안에 포함되었습니다(특수 내장 함수에 의해 제어됨 local).삭제되었습니다왜냐하면 기능을 위해 개발된 단순한 모델에 맞지 않고 역사적 관행의 일부가 아닌 또 다른 새로운 특수 내장 기능을 추가하는 데 반대가 있기 때문입니다. 표준의 향후 버전이 이 지역 변수 메커니즘을 채택하는 경우 구현에서는 식별자 local(KornShell에서 사용되는 대로 ) 를 보존해야 합니다 .typeset

(강조는 내 것)

관련 정보