[unix] 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 보증입니까?



답변

보증 :

2.9.5 기능 정의 명령

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

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


답변

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

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

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

네, 현재보고있는 행동은 POSIX에 의해 보장됩니다.

POSIX는하지 않은 표준화 local , 아직 :

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

[..] 함수 내의 지역 변수를 고려하여 다른 초기 제안에 포함 local 되었지만 함수에 대해 개발 된 간단한 모델에 맞지 않고 아직 추가에 반대가 있었기 때문에 제거되었습니다. 역사적 실천의 일부가 아닌 또 다른 새로운 특별 내장. 구현은 식별자를 예약한다 local(물론 같이 typeset케이스에 콘 셸에 사용 된)이 로컬 변수 메커니즘이 표준의 향후 버전에서 채택된다.

(강조 광산)


답변