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

Lyn*_*ite 3 fish

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

我将问题缩小到 MWE:

function example
    eval (echo 'set -x FOO 1;')
end
Run Code Online (Sandbox Code Playgroud)

调用:

>example
>echo $FOO
Run Code Online (Sandbox Code Playgroud)

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

Zan*_*hey 7

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

试试set -gx FOO


gol*_*cks 7

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

function trythis
     set -x foo bar
end
Run Code Online (Sandbox Code Playgroud)

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

尝试:

  eval (echo 'set -gx FOO 1;') 
Run Code Online (Sandbox Code Playgroud)

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