zsh: "로컬 내보내기"를 구현할 수 있나요?

zsh: "로컬 내보내기"를 구현할 수 있나요?

local exportzsh에서 구현할 수 있습니까 ? 아마도 try와 Always를 사용할 수 있을까요?

이로 인해 경쟁 조건이 발생합니까?

"로컬 내보내기"란 하위 프로세스(범위 내)에서 액세스할 수 있는 로컬 변수와 정확히 동일한 것을 의미합니다.

예:

function a() {
 local export YACY_TIMEOUT=60
 yacy -r -d sth
 }
 export YACY_TIMEOUT=4
 echo "$YACY_TIMEOUT" # 4
 a
 echo "$YACY_TIMEOUT" # 4

답변1

변수는 하위 프로세스에서 항상 사용할 수 있습니다. 존재하다:

a=1
(echo "$a")

1이 보입니다.

당신이 의미하는 바는 변수가 로컬 범위를 갖고 환경으로 내보내져 전달될 수 있기를 원한다는 것입니다.환경 변수로명령은처형된. 명령을 실행하면 프로세스의 메모리가 지워지고(환경은 프로세스의 일부 데이터를 유지하는 방법임) 하위 프로세스를 포크하면 전체 메모리가 복사되어 모든 것이 유지됩니다.

이렇게 하려면 다음을 사용할 수 있습니다 local -x.

a=(1 2)
f() {
  local -x a=3
  typeset -p a
  printenv a # printenv being *executed*
}
f
typeset -p a

다음을 제공합니다:

typeset -x a=3
3
typeset -a a=( 1 2 )

또는 export선언 후에 이를 수행 할 수 있습니다 local.

a=(1 2)
f() {
  local a=3
  export a
  typeset -p a
  printenv a # printenv being *executed*
}
f
typeset -p a

변수를 쉘 변수로 정의하지 않고도 단일 명령 환경에서 변수를 전달할 수 있습니다.

a=(1 2)
f() {
  a=3 printenv a # printenv being *executed*
}
f
typeset -p a

localAlmquist 쉘은 1980년대 후반에 시작되었지만 다르게 작동 합니다 zsh. Almquist 셸(및 NetBSD/FreeBSD의 대시 및 sh와 같은 하위 항목)에서는 local변수의 범위만 영향을 받으며 변수의 값이나 속성은 변경되지 않습니다.

zsh는 외부 범위의 변수와 독립적으로 완전히 새로운 변수를 선언한다는 점에서 localksh93과 더 유사하게 작동합니다 .typeset

ksh88, bash 및 pdksh localtypeset이 작업을 시도하지만 여전히 다음을 포함하여 외부 범위의 변수에서 일부 속성을 상속합니다.출구속성. 이는 ksh93에서 변경되었지만 ksh93도 정적 범위 지정으로 전환하고 function f { ...; }해당 구문을 사용하여 선언된 함수 내에서만 로컬 범위 지정을 구현했습니다.

답변2

명령이 호출될 때 쉘 범위에 있는 동일한 이름의 쉘 변수 값과 값이 다를 수 있는 환경 변수를 프로세스에 제공하려고 한다고 가정합니다.

a () {
    YACY_TIMEOUT=60 yacy -r -d std
}

이는 명령을 실행하고 환경 변수에 대한 특정 값을 제공하기 위한 표준 구문입니다. 변수가 YACY_TIMEOUT함수 본문과 동일한 범위에 있으면 a수정되지 않습니다.

이는 모든 POSIX 쉘에서 작동합니다.

이것은 무엇을 위한 것인가?아니요YACY_TIMEOUTdo를 사용하면 함수를 호출하기 전에 함수 내에서 "로컬" 값을 사용할 수 있습니다 yacy.

zsh또는 다음 을 사용하여 지역 변수 선언을 지원하는 local다른 쉘 에서

a () {
    local YACY_TIMEOUT=60

    YACY_TIMEOUT=$YACY_TIMEOUT yacy -r -d sth
}

이 경우 함수의 로컬 함수 YACY_TIMEOUT입니다 . a환경 변수로서 프로세스에 변수를 주입하는 것은 yacy제가 제공한 첫 번째 예에서와 같이 호출 전에 할당을 추가하여 수행됩니다.

Now YACY_TIMEOUT는 기본이며 yacy프로세스 환경에서 사용할 수 있습니다. 이는 local.

답변3

서브쉘을 사용하세요:

function a() (
 export YACY_TIMEOUT=60
 yacy -r -d sth
)

예:

% a () ( TIMEOUT=60; env | grep TIMEOUT )
% export TIMEOUT=4
% echo $TIMEOUT
4
% a
TIMEOUT=60
% echo $TIMEOUT
4

관련 정보