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

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

跑步时这个脚本,我遇到了一个错误这条线(相关片段如下):

...
_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
...

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

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

答案1

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

$ export a=$(echo 1 -2)
export: not valid in this context: -2

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

PATH=$_NEW_PATH; export PATH

甚至:

PATH=$_NEW_PATH export PATH

答案2

我想我明白了,为了 POSIX 合规性,我需要在这里使用双引号。以下修复了它。

export CONDA_ENV_PATH="$(get_dirname "$_THIS_DIR")"

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

答案3

当我忘记在 zshrc 中添加要导出为别名的变量名时,就发生了这种情况:

错误的

export /Library/Java/JavaVirtualMachines/ibm-semeru-openjdk-17.jdk/Contents/Home

好的:

export JAVA_HOME=/Library/Java/JavaVirtualMachines/ibm-semeru-openjdk-17.jdk/Contents/Home

相关内容