대시에서는 함수와 변수가 별도의 네임스페이스에 있는 것처럼 보입니다.
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
(강조는 내 것)