有什么方法可以导出作为 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
有人在对一个问题的评论中指出了这一点,不幸的是我在意识到我仍然有问题之前删除了这个问题。在定义内联变量时不包含分号是很常见的,因此该脚本的其他用户很可能会犯与我相同的错误。如何确保在这两种情况下都设置了导出的变量?
为命令添加分配前缀只会更改该命令的环境。请参阅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