我在试图在 Fish 函数中根据程序的输出动态设置一些变量时遇到了一个问题。
我将问题范围缩小到 MWE:
function example
eval (echo 'set -x FOO 1;')
end
呼叫:
>example
>echo $FOO
导致没有输出——即 FOO 环境变量尚未设置。我应该怎么做?
答案1
同样的事情以更简单的形式发生:
function trythis
set -x foo bar
end
如果您现在运行trythis
和echo $foo
,它也不会设置。这是因为 Fish-x
本身不会改变变量的范围,默认情况下变量是函数的局部变量,除非它已经全局或普遍存在。
尝试:
eval (echo 'set -gx FOO 1;')
其中 theg
代表全局。这使得变量像普通的 POSIX export
ed 值一样工作。有趣的是,它的工作方式与eval
普通的工作方式相同set
;如果您g
直接在命令行上使用该行 sans ,$FOO
则已设置,因此eval
进程替换()
没有引入新的作用域或子 shell,并且当在函数中以这种方式执行时,该函数的范围适用。
答案2
您需要为您的set
命令指定范围。如果没有它,默认作用域是函数的本地作用域。请参阅Fish 手册中有关环境变量的部分变量作用域的默认规则
尝试set -gx FOO
。