是否可以local export
在 zsh 中实现?可能总是使用 try 吗?
这会产生竞争条件吗?
通过“本地导出”,我的意思是与本地变量完全一样的东西,子流程(在范围内)可以访问。
例子:
function a() {
local export YACY_TIMEOUT=60
yacy -r -d sth
}
export YACY_TIMEOUT=4
echo "$YACY_TIMEOUT" # 4
a
echo "$YACY_TIMEOUT" # 4
是否可以local export
在 zsh 中实现?可能总是使用 try 吗?
这会产生竞争条件吗?
通过“本地导出”,我的意思是与本地变量完全一样的东西,子流程(在范围内)可以访问。
例子:
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。
我认为您的意思是您希望变量具有本地范围并导出到环境,以便将它们作为环境变量传递给执行的命令。命令的执行是擦除进程内存的事情(环境是在其中保存一些数据的一种方式),fork 一个子进程复制整个内存,因此所有内容都被保留。
为此,您可以使用
local -x
:给出:
或者你可以
export
在声明后这样做local
:请注意,您可以在单个命令的环境中传递变量,而无需将其定义为 shell 变量,其中:
请注意,它
local
起源于 80 年代后期的 Almquist shell,但与zsh
's. 在 Almquist shell(及其后代如 dash 和 NetBSD/FreeBSD 的 sh)中,local
仅影响变量的范围,不会更改变量的值或属性。zsh 的
local
工作方式更像 ksh93typeset
,因为它声明了一个全新的变量,该变量独立于外部范围内的变量。ksh88、bash 和 pdksh 的
local
/typeset
也尝试这样做,但仍然从外部范围的变量中继承一些属性,包括导出属性。这在 ksh93 中发生了变化,但请注意 ksh93 也切换到静态范围,并且仅在使用该function f { ...; }
语法声明的函数中实现本地范围。假设您想要做的是为进程提供一个环境变量,该变量的值可能与调用命令时在 shell 范围内的具有相同名称的 shell 变量的值不同:
这是运行命令并为其赋予特定环境变量值的标准语法。变量
YACY_TIMEOUT
,如果它与函数体存在于同一范围内,则a
不会被修改。这适用于任何 POSIX shell。
这没有做的是允许您
YACY_TIMEOUT
在调用之前使用函数内部的“本地”值yacy
。在
zsh
或任何其他支持用 声明的局部变量的 shell 中local
,您可以这样做在这里,
YACY_TIMEOUT
将是a
函数的本地。在过程中将变量作为环境变量注入就像yacy
我给出的第一个示例一样,通过在调用之前进行赋值。现在
YACY_TIMEOUT
既是本地的,也可以在yacy
进程的环境中使用。这适用于任何支持使用local
声明局部变量的 shell。使用子外壳:
例子: