为什么 set -x 不能在 Fish 函数的 eval 中工作?

为什么 set -x 不能在 Fish 函数的 eval 中工作?

我在试图在 Fish 函数中根据程序的输出动态设置一些变量时遇到了一个问题。

我将问题范围缩小到 MWE:

function example
    eval (echo 'set -x FOO 1;')
end

呼叫:

>example
>echo $FOO

导致没有输出——即 FOO 环境变量尚未设置。我应该怎么做?

答案1

同样的事情以更简单的形式发生:

function trythis
     set -x foo bar
end

如果您现在运行trythisecho $foo,它也不会设置。这是因为 Fish-x本身不会改变变量的范围,默认情况下变量是函数的局部变量,除非它已经全局或普遍存在。

尝试:

  eval (echo 'set -gx FOO 1;') 

其中 theg代表全局。这使得变量像普通的 POSIX exported 值一样工作。有趣的是,它的工作方式与eval普通的工作方式相同set;如果您g直接在命令行上使用该行 sans ,$FOO则已设置,因此eval进程替换()没有引入新的作用域或子 shell,并且当在函数中以这种方式执行时,该函数的范围适用。

答案2

您需要为您的set命令指定范围。如果没有它,默认作用域是函数的本地作用域。请参阅Fish 手册中有关环境变量的部分变量作用域的默认规则

尝试set -gx FOO

相关内容