Zsh: 모든 비전역 매개변수를 익명/로컬 내부 함수에 넣습니다.

Zsh: 모든 비전역 매개변수를 익명/로컬 내부 함수에 넣습니다.

이 설명이 잘못된 경우 정정해 주십시오. zsh 스크립트 내에 정의된 모든 변수/매개변수는 현재 쉘 세션 내에서 전역적으로 지속 범위를 유지합니다.

위의 진술이 사실이라면 현재 쉘의 환경 변수/다른 zsh 스크립트를 망칠 수 있습니다. 가능하다면 zsh 스크립트의 모든 변수/인수를 익명/로컬 내부 함수에 넣어야 합니까?

가능성은 다음과 같이 계산할 수 있습니다.

  1. 로컬 범위 => 익명 함수의 변수를 즉시 사용합니다.
  2. maker => 내장 함수를 사용하여 always범위를 표시합니다.always
  3. 표시하되 거의 사용하지 않는 트랩을 사용하여 표시 => 트랩 내부 기능을 사용

문제와 목적은 모든 변수/매개변수가 zsh 스크립트의 지역 변수/매개변수여야 하며 해당 zsh 스크립트에서 사용 후 삭제되어야 한다는 것입니다.

편집: 쉘 스크립트를 실행하고 얻는 것이 정말 혼란스럽습니다.

source스크립트 내의 스크립트를 원 하지만 소스 스크립트의 영향을 최소화하여 스크립트가 호출되는 환경을 방해하려고 합니다.

@Stéphane Chazelas가 질문에 답변했지만 이해하는대로 명확하게 설명하고 틀렸다면 수정해 주시기 바랍니다.

쉘 스크립트 내에서 쉘 스크립트를 실행하면 ./script.zsh새 쉘이 호출되어 스크립트를 실행한 다음 호출 스크립트에 종료 코드가 반환됩니다.

쉘 스크립트에 들어가기 쉘 스크립트는 . ./script.zsh현재 쉘의 하위 프로세스를 생성하고 모든 변경 사항(새 변수, 함수 정의)을 현재 쉘의 환경에 배치합니다. 이는 대부분의 사용자가 사용하기를 원할 것으로 예상되는 동작입니다. 그들은 프로세스를 조달하지만 댓글에 언급된 @Stéphane Chazelas와 같은 익명 기능을 사용하여 원하지 않는 부분을 제외할 수 있습니다. alias전역 범위 는 항상 나타납니다.

답변1

아니요, 스크립트를 실행할 때 쉘은 스크립트 내용을 해석하기 위해 스크립트 인터프리터가 실행되는 새로운 프로세스를 분기합니다.

모든 변수 할당은 쉘 변수에만 영향을 미칩니다저것쉘 호출저것프로세스. 프로세스가 종료되면 호출 셸의 변수는 영향을 받지 않습니다.

내가 아는 유일한 예외는 fish쉘을 사용하여 set -U var value정의하는 것 입니다.fish 범용 변수, 이는 fish일종의 IPC 메커니즘을 사용하여 실행 중인 프로세스 간에 변수 값을 전달하고, fish실행 중인 프로세스가 없을 때 변수 값을 유지하기 위해 영구 저장소를 사용합니다.fish

지금 당신이원천스크립트(대신구현하다그것) 쉘 .이나 내장 명령을 사용하면 다음과 같이 말할 수 있습니다.source당신의쉘을 사용하여 이 스크립트의 코드를 해석합니다(여기에는 하위 프로세스가 포함되지 않음, . ./script.zsh유사함 eval "$(<script.zsh)"). 하지만 일반적으로 다음과 source같은 경우에만 사용합니다.하다변수 할당이 다음과 같이 쉘에 영향을 미치기를 바랍니다.구입환경 파일.

이제 원하는 곳에 스크립트를 얻는 것을 상상할 수 있습니다.변하기 쉬운,기능,별명...호출 셸에 정의되어 있지만 일부는 보조 변수일 뿐이지만 그렇지 않습니다. 그렇다면 다음과 같은 로컬 범위의 익명 함수를 사용할 수 있습니다.

myfunc() echo hi # function meant to be defined for the invoker
myvar=value  # same for a variable

(){ local i # i variable local
  for i in foo bar
    alias $i='echo x' # alias defined globally
  done
}

(zsh는 함수, 별칭이 아닌 변수 및 옵션의 로컬 범위 지정만 구현합니다...)

관련 정보