local export
zsh에서 구현할 수 있습니까 ? 아마도 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
local
Almquist 쉘은 1980년대 후반에 시작되었지만 다르게 작동 합니다 zsh
. Almquist 셸(및 NetBSD/FreeBSD의 대시 및 sh와 같은 하위 항목)에서는 local
변수의 범위만 영향을 받으며 변수의 값이나 속성은 변경되지 않습니다.
zsh는 외부 범위의 변수와 독립적으로 완전히 새로운 변수를 선언한다는 점에서 local
ksh93과 더 유사하게 작동합니다 .typeset
ksh88, bash 및 pdksh local
도 typeset
이 작업을 시도하지만 여전히 다음을 포함하여 외부 범위의 변수에서 일부 속성을 상속합니다.출구속성. 이는 ksh93에서 변경되었지만 ksh93도 정적 범위 지정으로 전환하고 function f { ...; }
해당 구문을 사용하여 선언된 함수 내에서만 로컬 범위 지정을 구현했습니다.
답변2
명령이 호출될 때 쉘 범위에 있는 동일한 이름의 쉘 변수 값과 값이 다를 수 있는 환경 변수를 프로세스에 제공하려고 한다고 가정합니다.
a () {
YACY_TIMEOUT=60 yacy -r -d std
}
이는 명령을 실행하고 환경 변수에 대한 특정 값을 제공하기 위한 표준 구문입니다. 변수가 YACY_TIMEOUT
함수 본문과 동일한 범위에 있으면 a
수정되지 않습니다.
이는 모든 POSIX 쉘에서 작동합니다.
이것은 무엇을 위한 것인가?아니요YACY_TIMEOUT
do를 사용하면 함수를 호출하기 전에 함수 내에서 "로컬" 값을 사용할 수 있습니다 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