我是一名 Zsh 用户,遇到了一个我不完全知道如何解决的问题:
- 如果我在
zshrc
[BB_ENV_EXTRAWHITE
] 中附加一个环境变量(在 Bash 中有效),我会收到解析错误:export BB_ENV_EXTRAWHITE+=' CCACHE_DEPEND CCACHE_SLOPPINESS ICECC_REMOTE_CPP
/home/dev/.zshrc:export:139: not valid in this context: BB_ENV_EXTRAWHITE+
- 我尝试通过将
export
命令更改为以下命令来解决这个问题,这有助于正确设置变量,但是现在当我zshrc
多次获取变量时,我会在变量中得到重复的值,而这是我不想要的:export BB_ENV_EXTRAWHITE="${BB_ENV_EXTRAWHITE} CCACHE_DEPEND CCACHE_SLOPPINESS ICECC_REMOTE_CPP"
zshrc
我正在寻找一种可以附加到变量的解决方案,但如果我添加了别名等,每次我获取变量时都不会这样做。
答案1
你几乎肯定可以这样做
BB_ENV_EXTRAWHITE+=' CCACHE_DEPEND CCACHE_SLOPPINESS ICECC_REMOTE_CPP'
如果它是环境变量,那么导出标志很可能已经设置。export BB_ENV_EXTRAWHITE
如果情况并非如此,您也可以添加单独的命令。
bash 语法中没有任何东西可以避免重复。你在哪里设置 bash 的变量?也许使用.zlogin
也许而不是.zshrc
只为初始登录设置它。另一种常见的方法是设置环境变量,但只在检查诸如避免在子 shell 中运行之类的条件.zshenv
内,我经常使用:if
$SHLVL
if [[ ! -o login && ! -o privileged && -o rcs && $SHLVL = 1 ]]; then
-o login
其中的测试可能会被删除-这取决于情况。
答案2
如果您可以接受使用数组,那么您可以坚持使用+=
语法。
以下是一个例子:
# define the array (-a) to hold only unique values (-U)
typeset -U -a foo_array
# initial values
foo_array=(one two three)
# print the content
print -l $foo_array
one
two
three
# add values
foo_array+="one"
foo_array+="four"
foo_array+=(two five)
# recheck the array
print -l $foo_array
one
two
three
four
five
注意,重复添加的值不会出现多次,因为我们-U
在声明中使用了!
您可以将数组用作$foo_array
(行为就像这些值是单个参数一样)或"$foo_array"
(行为就像这些值被缝合到一起形成由空格分隔的单个字符串一样):
$ printf "%s|" $foo_array
one|two|three|four|five|
$ printf "%s|" "$foo_array"
one two three four five|