zsh:是否可以实现“本地导出”?

zsh:是否可以实现“本地导出”?

是否可以local export在zsh中实现a?可能使用尝试和总是?

这会产生竞争条件吗?

通过“本地导出”,我的意思是与本地变量完全相同的东西,子进程可以访问它(在范围内)。

例子:

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

请注意,您可以在单个命令的环境中传递变量,而无需将其定义为 shell 变量:

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

请注意,local起源于 80 年代末的 Almquist shell,但工作方式与 不同zsh。在 Almquist shell(及其后代,如 NetBSD/FreeBSD 的 dash 和 sh)中,local仅影响变量的范围,不会更改变量的值或属性。

zsh 的local工作方式更像 ksh93,typeset因为它声明了一个独立于外部作用域中的变量的全新变量。

ksh88、bash 和 pdkshlocaltypeset尝试这样做,但仍然从外部作用域的变量继承一些属性,包括出口属性。这在 ksh93 中发生了变化,但请注意,ksh93 也切换到静态作用域,并且仅在使用该function f { ...; }语法声明的函数中实现本地作用域。

答案2

假设您想要做的是为进程提供一个环境变量,其值可能与调用命令时 shell 范围内的同名 shell 变量的值不同:

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

这是运行命令并为其指定环境变量的特定值的标准语法。如果变量YACY_TIMEOUT与函数体存在于同一作用域中a,则不会被修改。

这适用于任何 POSIX shell。

这是做什么的不是do 是允许您YACY_TIMEOUT在调用之前使用函数内的“本地”值yacy

zsh或任何其他支持使用 声明局部变量的 shell中local,您可以这样做

a () {
    local YACY_TIMEOUT=60

    YACY_TIMEOUT=$YACY_TIMEOUT yacy -r -d sth
}

在这里,YACY_TIMEOUTa函数的本地函数。在进程中将变量作为环境变量注入的情况yacy与我给出的第一个示例中一样,通过在调用之前添加赋值来实现。

NowYACY_TIMEOUT既是本地的,也可在yacy流程环境中使用。这适用于任何支持使用local声明局部变量的 shell。

答案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

相关内容