$val
들어가 a ()
지만 눈에 띄지 않는 방법이 있나요 b ()
?
set -u -e -o pipefail
a () {
local +x val="myval"
echo "in a: VAL= $val"
b
}
b () {
echo "in b: VAL= $val"
}
a
생산:
in a: VAL= myval
in b: VAL= myval # This should not happen.
변수가 다른 함수에 표시되지 않도록 보호하기 위해 하위 쉘을 사용하는 대신 local
/ 옵션을 사용하고 싶습니다 .typeset
내가 확인했다수동(기능부분, 조판부분) 방법은 없을 것 같습니다. 그러나 나는 쉽게 뭔가를 놓칠 수 있었습니다.
답변1
b
변수를 제한하기 위해 서브셸을 사용하는 대신 새 프로세스로 실행할 수 있습니다. 그러면 내보내도록 선택한 변수를 제외한 호출자의 변수에 액세스할 수 없습니다.
함수를 새 스크립트로 이동
단일 함수만 필요한 경우 전체 함수를 별도의 스크립트로 이동하세요.
b
:
#!/usr/bin/env mksh
set -u -e -o pipefail
echo "in b: VAL= $val"
산출:
in a: VAL= myval
./b[4]: val: parameter not set
래퍼 함수 사용
이 기능이 필요한 함수가 많은 경우 해당 함수를 모두 하나의 파일로 이동하고 소스 코드 및 실행을 위한 래퍼 함수를 포함할 수 있습니다.
funcs
:
#long options not passed on by -$-
set -o pipefail
#execute function without inheriting environment variables
function ni () {
WHERE="${_%/*}"
mksh -$- -c "source $WHERE/funcs ; $*"
}
function a () {
local +x val="myval"
echo "in a: VAL= $val"
ni b
}
function b () {
echo "in b: VAL= $val"
}
이 "라이브러리"는 source
기본 스크립트에서 가져와야 합니다.
#!/usr/bin/env mksh
set -e -u -o pipefail
WHERE="${_%/*}"
source $WHERE/funcs
a
단점은 오류 위치(스크립트 및 줄 번호)를 잃어버릴 수 있다는 것입니다.
in a: VAL= myval
mksh: val: parameter not set
답변2
아니요.
하지만, 호출이 b
마무리 호출이고 해당 인수를 "만" 구성해야 하는 경우 이를 수행하는 방법이 있습니다. 이 방법은 "클래스 경로 찾기 및 JAR 실행" 스크립트에서 사용했습니다.
function a {
local val …
# do something with local variables
# construct arguments by setting the global variable _ to it
set -A _ -- b arg1…
# could even unset -f a here
}
a
"${_[@]}"
존재하다내 스크립트외부 명령을 호출할 때 마지막 줄을 사용하고 exec "${_[@]}"
, 내보낸 환경 변수가 실수로 오염되는 것을 방지하기 위해 로컬 변수 기술을 사용합니다.
어쩌면 이것이 도움이 될까요?
전체 공개: 저는 mksh
개발자입니다.