korn 쉘 네임스페이스에 대한 별칭을 만들 수 있습니까? using 지시문 C++
(여러 네임스페이스를 함께 배치하고 기호가 모호하게 지정된 경우 (컴파일러) 오류를 발생시키는) 과 같은 것이 있습니까 ?
답변1
ksh는 다른 셸보다 고급 기능을 갖추고 있지만 그 핵심은 여전히 대규모 애플리케이션 작성에 적합한 언어라기보다는 간단한 작업을 자동화하고 작은 스크립트를 작성하기 위한 언어입니다. C++의 모든 기능은 물론 대규모 응용 프로그램용으로 설계된 일반적인 언어의 모든 기능을 기대할 수는 없습니다.
네임스페이스에 대한 별칭을 만들 수는 없을 것 같습니다. 해당 변수를 열거하고( 상위 네임스페이스에서 상속된 변수를 포함하려는 경우 typeset +p
또는 의 출력을 구문 분석하거나 사용) 이를 하나씩 복사하여 일종의 네임스페이스의 복사본을 만들 수 있습니다. 별칭을 사용하여 하나의 변수를 다른 변수로 만들 수 있지만 이는 네임스페이스 내에서 사용될 때만 작동합니다.typeset -p
${!.foo.*}
typeset -n
$ namespace foo { x=1; }
$ namespace bar { typeset -n x=.foo.x; echo $x; }
1
$ namespace foo { x=2; }
$ namespace bar { echo $x; }
2
$ echo ${.bar.x}
.foo.x
Ksh를 사용하면 한 단계 더 나아가 규칙 기능을 통해 변수를 읽거나 수정하거나 설정 해제할 때 임의의 코드를 실행할 수 있습니다. 예를 들어, 라는 함수를 정의하면 x.get
값이 검색될 때마다 함수가 호출됩니다.x
namespace bar {
x.get () { _=${.foo.x}; }
x.set () { .foo.x=${.sh.value}; }
x.append () { .foo.x+=${.sh.value}; }
x.unset () { unset ${.sh.name}; }
}
각 변수에 대해 이러한 변수를 정의해야 하며 네임스페이스에 추가된 변수를 감지할 수 없는 것 같습니다 foo
.
이는 여러 네임스페이스를 조회하도록 확장될 수 있습니다.
x.get () {
if ((${.foo.x+1}+${.bar.x+1}!=1)); then
echo 1>&2 "Ambiguous variable x, available in more than one of foo and bar"
exit 125
fi
_=${.foo.x-${.bar.x}}
}