ZSH 替代 BASH 导出 VAR+='...'

ZSH 替代 BASH 导出 VAR+='...'

我是一名 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|

相关内容