稳健地重新导出 bash 变量

问题描述 投票:0回答:1

有什么方法可以导出作为 shell 变量传递的变量吗?

setup.sh:

if [[ -z "$MYVAR" ]]; then
    MYVAR="default"
fi

export MYVAR=$MYVAR
export MYVAR2=$MYVAR
% . ./setup.sh
% echo $MYVAR
default
% echo $MYVAR2
default
% MYVAR=other . ./setup.sh
% echo $MYVAR 

% echo $MYVAR2
other

如果在获取脚本之前定义了 MYVAR,则不会设置它。

如果用分号分隔定义和源命令,那么它就可以工作:

% MYVAR=other; . ./setup.sh
% echo $MYVAR 
other
% echo $MYVAR2
other

有人在对一个问题的评论中指出了这一点,不幸的是我在意识到我仍然有问题之前删除了这个问题。在定义内联变量时不包含分号是很常见的,因此该脚本的其他用户很可能会犯与我相同的错误。如何确保在这两种情况下都设置了导出的变量?

bash
1个回答
0
投票

为命令添加分配前缀只会更改该命令的环境。请参阅man bash中的

简单命令扩展

如果没有命令名结果,则变量分配会影响当前的 shell 环境。 否则,变量将添加到执行命令的环境中,不会影响当前的 shell 环境。

这意味着使用分号 not 会更改

.
的环境,即将 $MYVAR 作为已导出的变量进行处理。您可以通过将以下行添加到
setup.sh
:

来测试它
export -p | grep MYVAR

由于某种原因,当源脚本结束时,该值不会传播回 shell。不过,我找到了一种解决方法:在脚本中,

unset
变量,然后
export
使用新值。再说一遍,出于我不知道的原因,
export -n
还不够。

if [[ -z $MYVAR ]] ; then
    MYVAR=default
fi
v=$MYVAR
unset MYVAR
export MYVAR=$v
export MYVAR2=$v
© www.soinside.com 2019 - 2024. All rights reserved.