Zsh:导出:在此上下文中无效

Ame*_*ina 12 zsh environment-variables command-substitution assignment

运行此脚本时,我在此行上遇到错误(下面的相关代码段):

...
_NEW_PATH=$("$_THIS_DIR/conda" ..activate "$@")
if (( $? == 0 )); then
    export PATH=$_NEW_PATH
    # If the string contains / it's a path
    if [[ "$@" == */* ]]; then
        export CONDA_DEFAULT_ENV=$(get_abs_filename "$@")
    else
        export CONDA_DEFAULT_ENV="$@"
    fi

    # ==== The next line returns an error 
    # ==== with the message: "export: not valid in this context /Users/avazquez/anaconda3"
    export CONDA_ENV_PATH=$(get_dirname $_THIS_DIR)

    if (( $("$_THIS_DIR/conda" ..changeps1) ));  then
            CONDA_OLD_PS1="$PS1"
            PS1="($CONDA_DEFAULT_ENV)$PS1"
    fi
else
    return $?
fi
...
Run Code Online (Sandbox Code Playgroud)

这是为什么?我找到了这张票,但我没有那个语法错误。

我在 GitHub 线程(例如此处)和邮件列表(例如此处)中发现了相同问题的报告

cuo*_*glm 12

在 zsh 中,如果没有用双引号括起来,则执行命令替换结果分词。因此,如果您的命令替换结果包含任何空格、制表符或换行符,则导出命令将被分解为多个部分:

$ export a=$(echo 1 -2)
export: not valid in this context: -2
Run Code Online (Sandbox Code Playgroud)

您需要双引号命令替换以使其工作,或使用更安全的语法:

PATH=$_NEW_PATH; export PATH
Run Code Online (Sandbox Code Playgroud)

甚至:

PATH=$_NEW_PATH export PATH
Run Code Online (Sandbox Code Playgroud)


Ame*_*ina 5

我想我明白了,为了符合 POSIX,我需要在这里加双引号。以下修复了它。

export CONDA_ENV_PATH="$(get_dirname "$_THIS_DIR")"
Run Code Online (Sandbox Code Playgroud)

以下优秀文章可能会有所帮助: