함수를 새 스크립트로 이동

함수를 새 스크립트로 이동

$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개발자입니다.

관련 정보