나 여기 처음이야 ksh
. 내가 보는 문제는 네임스페이스를 정의하면~에함수와 해당 네임스페이스 내에 정의된 변수는 네임스페이스 외부에 있는 동일한 이름의 변수를 삭제합니다.또한네임스페이스 변수를 만듭니다. 그러나 네임스페이스를 정의하면외부예상대로 작동하는 함수입니다.
나는 (강요) 사용을 주장
# ksh --version
version sh (AT&T Research) 93u+ 2012-08-01
다음 스크립트( testnamespace.sh
)는 문제를 보여줍니다.
#!/usr/bin/env ksh
function myfunc1 {
echo Original
}
function myfunc2 {
echo Original
}
function mytest {
echo ""
echo "In function, before namespace x"
othervar=1
echo " myvar = $myvar (expected value: 1)"
echo " othervar = $othervar (expected value: 1)"
echo " myfunc1 : $(myfunc1) (expected output: Original)"
namespace x {
echo ""
echo "In namespace x defined inside function"
echo " myvar = $myvar (expected value: 1)"
echo " othervar = $othervar (expected value: 1)"
echo " myfunc1 : $(myfunc1) (expected output: Original)"
myvar=2
othervar=2
function myfunc1 {
echo Modified
}
echo ""
echo " myvar = $myvar (expected value: 2)"
echo " othervar = $othervar (expected value: 2)"
echo " myfunc1 : $(myfunc1) (expected output: Modified)"
}
echo ""
echo "In function, after namespace x"
echo " myvar = $myvar (expected value: 1)"
echo " othervar = $othervar (expected value: 1)"
echo " myfunc1 : $(myfunc1) (expected output: Original)"
echo " .x.myvar = ${.x.myvar} (expected value: 2)"
echo " .x.othervar = ${.x.othervar} (expected value: 2)"
echo " .x.myfunc1 : $(.x.myfunc1) (expected output: Modified)"
}
myvar=1
echo ""
echo "Before function"
echo " myvar = $myvar (expected value: 1)"
echo " myfunc1 : $(myfunc1) (expected output: Original)"
mytest
echo ""
echo "After function"
echo " myvar = $myvar (expected value: 1)"
echo " myfunc1 : $(myfunc1) (expected output: Original)"
thisvar=1
echo ""
echo "Before namespace y"
echo " thisvar = $thisvar"
echo " myfunc2 : $(myfunc2) (expected output: Original)"
namespace y {
echo ""
echo "In namesapce y"
echo " thisvar = $thisvar (expected value: 1)"
echo " myfunc2 : $(myfunc2) (expected output: Original)"
thisvar=2
function myfunc2 {
echo Modified
}
echo ""
echo " thisvar = $thisvar (expected value: 2)"
echo " myfunc2 : $(myfunc2) (expected output: Modified)"
}
echo ""
echo "Outside namespace y"
echo " thisvar = $thisvar (expected value: 1)"
echo " myfunc2 : $(myfunc2) (expected output: Original)"
echo " .y.thisvar = ${.y.thisvar} (expected value: 2)"
echo " .y.myfunc2 : $(.y.myfunc2) (expected output: Modified)"
echo ""
실행 시 약간의 주석이 달린 출력 testnamespace.sh
:
# ./testnamepace.sh
Before function
myvar = 1 (expected value: 1)
myfunc1 : Original (expected output: Original)
In function, before namespace x
myvar = 1 (expected value: 1)
othervar = 1 (expected value: 1)
myfunc1 : Original (expected output: Original)
In namespace x defined inside function
myvar = 1 (expected value: 1)
othervar = 1 (expected value: 1)
myfunc1 : Original (expected output: Original)
myvar = 2 (expected value: 2)
othervar = 2 (expected value: 2)
myfunc1 : Modified (expected output: Modified)
In function, after namespace x
myvar = 2 (expected value: 1) <<--- Why are these
othervar = 2 (expected value: 1) <<--- both clobbered?
myfunc1 : Original (expected output: Original) <<--- But this is OK!
.x.myvar = 2 (expected value: 2)
.x.othervar = 2 (expected value: 2)
.x.myfunc1 : Modified (expected output: Modified)
After function
myvar = 2 (expected value: 1) <<--- Again, clobbered...
myfunc1 : Original (expected output: Original)
Before namespace y
thisvar = 1
myfunc2 : Original (expected output: Original)
In namesapce y
thisvar = 1 (expected value: 1)
myfunc2 : Original (expected output: Original)
thisvar = 2 (expected value: 2)
myfunc2 : Modified (expected output: Modified)
Outside namespace y
thisvar = 1 (expected value: 1)
myfunc2 : Original (expected output: Original)
.y.thisvar = 2 (expected value: 2)
.y.myfunc2 : Modified (expected output: Modified)
#
보시다시피, namespace x
after와 after(각각 전역적으로 정의되고 함수 내에서 정의됨)에 대한 값은 모두 네임스페이스 내에 할당된 값으로 재정의되었지만 재정의되지는 않습니다.myvar
thisvar
myfunc1
이것이 예상되는 동작입니까?
노트나는 서브 쉘에 대해 알고 있습니다. 하지만 서브쉘에 메모리 누수가 있기 때문에 네임스페이스를 사용해 보았습니다. 내가 사용하는 코드:
- 다양한 변수와 함수를 정의합니다.
- 주기를 입력하고,
- 뭔가를 해라
- 함수를 호출하다
- 서브셸에서:
- 특정 변수 및 함수 정의의 요점(이미 정의되었거나 정의되지 않았을 수 있음)다른 값기존 변수 및 함수)
- 다음 변수와 함수를 사용하세요
- 서브셸에서:
- 필요할 수 있는 일을 더 많이 수행원래변수 및 함수 정의
서브셸 방법의 문제점은 종료할 때 누수되는 메모리 양이 2차적으로 증가하는 것처럼 보인다는 것입니다(예: 루프를 약 1000회 반복한 후 4GB에 가깝게 누수됩니다...).
네임스페이스 접근 방식이 누출을 처리한다는 것을 확인했습니다. 문제는 업데이트된 변수 정의가 기존 변수 정의를 손상시켜 나중에 문제를 일으킬 수 있다는 것입니다.
어떤 제안이 있으십니까? !