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 이름 참조)이고 특수 내장 유틸리티의 이름이 아닌지 확인해야 합니다. 구현에서는 함수 이름의 다른 문자를 확장자로 허용할 수 있습니다.구현 시에는 함수와 변수에 대해 별도의 네임스페이스를 유지해야 합니다.

답변2

변수와 함수는 대시의 서로 다른 네임스페이스에 있으며 이는 다음으로도 지정됩니다.POSIX:

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

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

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

POSIX는 그렇지 않았습니다.표준화된 local,아직:

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

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

(강조는 내 것)

관련 정보