在 zsh 下获取 .sh 文件:addvar:1: 错误替换错误消息

Sourcing a .sh file under zsh : addvar:1: bad substitution error message

我有以下 .sh 文件,我希望能够在 zsh 下获取它,这是我的默认设置 shell。文件的开头是(后面只有export variable = path):

function addvar () {
local tmp="${!1}" ;
tmp="${tmp//::/:}" ; tmp="${tmp/#:/}" ; tmp="${tmp/%:/}" ;
export =":${tmp}" ;
}

执行时:$ source file.sh

我收到以下错误消息:

addvar:1: bad substitution

谁能看出哪里出了问题?

ps : 我试过直接放在最上面 : #!/bin/bash 直接按 $ ./file.sh

执行

但它什么也没做(none 导出变量)。

I have the following .sh file that I would like to be able to source under zsh, which is my default shell.

该文件扩展名表明该文件是为 Bourne-family shell 而设计的,但它没有说明是哪一个,而且该家族的各个成员彼此之间存在各种不兼容性。如果有 shebang 行(以 #! 开头并作为文件的第一行出现的行),那么它 可能 给出更具体的指示 shell 文件的目的,但仅当文件直接执行时才具有功能相关性,而不是在获取文件时具有功能相关性。

I get the following error message :

addvar:1: bad substitution

Could anyone see what's wrong ?

问题在于

local tmp="${!1}" ;

,特别是 ${!1}。在Bash中,这是一个间接变量引用,扩展为</code>扩展命名的变量的值。但是,在 Zsh 中,它是无效的,因此您不能在 shell.</p> 中使用该代码 as-is <p>看起来该函数应该将指定为第二个参数的值添加到由其第一个参数命名的环境变量的 path-like 值中,删除该值之前出现的任何内容。由于您不能在 Zsh 中使用它 as-is,我建议您不要使用它。您可以改为使用一个函数来计算适当的更新值,并将重新分配留给调用者。示例:</p> <pre><code>add_path_element() { local tmp="${1//::/:}" tmp="${tmp/#:/}" tmp="${tmp/%:/}" echo -n "${tmp}:" } # Instead of "addvar PATH /dir/to/add": export PATH=$(add_path_element "$PATH" /dir/to/add)

还应该可以通过使用 eval built-in 来实现在 Zsh(和 Bash)中工作的原始 addvar 函数的一个版本,但我不能向您推荐这种方法,因为 eval 非常危险。我在这里提到它以防万一有人建议它。作为基本规则,在您足够精通 shell 编程以彻底理解为什么不应该使用 eval.

之前,不要使用 eval