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


13

대시에서 함수와 변수는 별도의 네임 스페이스에있는 것처럼 보입니다.

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
코드는 실제로 fn함수가 별도의 네임 스페이스에 있음을 증명하지 않습니다 . 한 번 실행하면 정의가 지워지면 정확히 동일한 동작을 볼 수 있습니다. 함수가 여전히 정의되어 있음을 보여 주어야합니다 (예 : type fn나중에).
Alexis

답변:


13

보증 :

2.9.5 기능 정의 명령

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

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


또한주의 unset-v하고 -f주어진 이름으로 변수 나 함수를 설정 해제를 선택할 수 있습니다. bash(대부분의 다른 조개와 반대) 설정 해제합니다 foo 기능 을 가진 unset foo어떤 존재하지 않는 경우는 foo변수를 (!), POSIX에 의해 허용되는 행동을. POSIX 스크립트에 좋은 항상 하나를 사용에 연습을 이유 있다고 -v-f(에 물론 bash뿐만 아니라 스크립트 만, 참고 unset항상에서 변수 설정을 해제하지 않을 수는 bash, bash변수 범위 지정은 꽤 몇 가지 문제가 있습니다).
Stéphane Chazelas

셸 쇼크 전 bash에서는 변수와 함수를 주어진 이름으로 내보낼 때 문제가 발생합니다. bash는 둘 다 동일한 환경 변수 이름을 사용하기 때문에 (환경에서 두 번 입력하면 일부 명령이 제거 될 수 있음) 그들 중 하나)
스테판 Chazelas

8

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

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

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

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

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

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

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

(강조 광산)


(80 년대 후반)에서 재하는에 기반 대시도있다 local, 배쉬는 최근 (4.4) 빌린 (중증 예를 들어 bash는 하나의 부서에 비해)가 최대한 일관성있는 인터페이스 중 하나, local -현지 범위에 대한 ( ash) (해당 하나의 $-변수에 대해서만 애쉬 스타일 범위 지정 구현 ). ksh 및 yash에는 local(pdksh 변형 만 있음 local)이 없지만 typeset대신 ksh93 typeset에서는 ksh 구문을 사용하여 선언 된 함수에서만 로컬 (정적) 범위를 제공합니다).
Stéphane Chazelas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.