하위 프로세스의 원래 변수를 덮어쓰지 않고 지역 변수를 선언할 수 있습니까?

하위 프로세스의 원래 변수를 덮어쓰지 않고 지역 변수를 선언할 수 있습니까?

기존 ENV 변수가 있는 경우 원래 값을 사용하여 하위 프로세스에서 새 지역 변수를 선언할 수 있습니까?

자식 프로세스가 어떤 변수를 사용할지는 알 수 없다는 점을 명심하세요. 따라서 var=original mycmd -with -args원래 값을 저장하고 이를 조작하는 것만으로는 충분하지 않습니다.

# print.sh:
echo "from print.sh: $MY_VAR"

# local.sh:
run () {
  declare MY_VAR="should not be seen"
  bash print.sh
}
MY_VAR="original" run

위의 내용은 다음과 같이 인쇄됩니다. 대신 from print.sh: should not be seen: from print.sh: original비록 local내가declarefunction body

몇 가지 옵션이 있기를 바랐 declare/local/typeset지만 아무것도 찾지 못했습니다. 이 변수에 대한 값을 로컬로 설정했지만 하위 프로세스는 원래 값을 사용합니다.

답변1

일반적인 규칙은 환경 변수에 모두 대문자를 사용하고 스크립트 로컬 변수에 모두 소문자를 사용하는 것입니다. 이렇게 하면 지역 변수가 환경 변수와 충돌하지 않습니다.

제 생각에는 zsh에는 변수의 로컬 값과 내보낸 값을 구별할 수 있는 옵션이 없다고 생각합니다. 해결 방법은 값을 저장하고 복원하는 것입니다. 이는 저장하려는 변수를 나열한다는 의미입니다.

run () {
  typeset -A _saved_variables
  _saved_variables[foo]=$foo _saved_variables[bar]=$bar
  local foo='not seen' bar='not seen either'
  foo=$_saved_variables[foo] bar=$_saved_variables[bar] bash print.sh
}

전체 환경을 보존하려면 typeset -px구문 분석 가능한 형식으로 인쇄물을 실행할 수 있습니다. 읽기 전용 변수를 내보낸 경우에는 작동하지 않습니다. 이 경우를 처리하려면 변수 이름을 확인하고 읽기 전용이 아닌 변수만 선택해야 합니다.

run () {
  _saved_variables=`typeset -px`
  local foo='not seen' bar='not seen either'
  (eval $_saved_variables; exec bash print.sh)
}

또 다른 옵션은 스크립트를 다르게 구성하는 것입니다. 하위 쉘에서 실행할 명령을 결정하고 상위 쉘에서 실행할 수 있도록 인쇄(적절하게 인용)합니다.

run () {
  # you can clobber variables here
  printf %q "bash print.sh"
}
eval $(run)

답변2

이 질문은 Zsh에만 해당됩니다. 그러나 Bash 및 mksh 사용자의 경우 다음과 같은 주의사항이 가능합니다.https://unix.stackexchange.com/a/272576/42107

관련 정보