Eval在鱼壳功能上工作奇怪

时间:2015-11-27 05:17:30

标签: fish

我尝试使用docker的命令来更改docker机器上下文。这是命令和输出:

docker-machine env dev

set -x DOCKER_TLS_VERIFY "1";
set -x DOCKER_HOST "tcp://192.168.99.101:2376";
set -x DOCKER_CERT_PATH "/Users/sandric/.docker/machine/machines/dev";
set -x DOCKER_MACHINE_NAME "dev";
# Run this command to configure your shell:
# eval (docker-machine env dev)

功能代码,我放在.config / fish / config.fish:

function cdm
  eval (docker-machine env $argv)
end

因此,当尝试在新会话中运行cdm时,会评估函数,但上下文没有更改。但是,如果我跑了:

eval (docker-machine env default)

从命令提示符,并尝试使用不同的参数运行cdm - 一切正常。所以我怀疑它与现有的环境变量有关,这个命令试图从fish函数设置..我甚至尝试过试验并将该函数更改为别名(这也是我得到的fish函数的别名)命令常量而不是参数:

alias cdm "eval (docker-machine env dev)"

它的工作方式相同 - 如果我在新打开的会话中首先运行此别名,它没有更改环境变量,但是如果我从命令提示符运行eval代码 - 在该别名按预期工作之后。

那么,最重要的是,任何人都有任何想法吗?

1 个答案:

答案 0 :(得分:2)

看起来Docker的输出没有指定显式范围,所以当你在函数中运行它并且那些变量没有在其他地方定义时,它们将最终进入函数的范围。

但是,如果从命令提示符运行相同的代码,最终将在全局范围内定义变量,然后由函数中的set更新。

请参阅documentation for set

  

创建或更新变量时的范围规则是:

     
      
  1. 如果变量显式设置为通用,全局或本地,   该设置将受到尊重。如果存在同名变量   在不同的范围内,该变量不会被更改。

  2.   
  3. 如果未将变量显式设置为universal,global或   本地,但先前已定义,以前的变量范围是   使用

  4.   
  5. 如果未将变量显式设置为universal,global或   本地且从未定义过,变量将是本地变量   当前正在执行的功能。请注意,这与...不同   使用-l或--local标志。如果使用其中一个标志,则   变量将是当前最内部执行块的本地变量,   而没有这些变量将是函数的本地变量。如果不   函数正在执行,变量将是全局的。

  6.   

要解决此问题,请尝试使用cdm定义--no-scope-shadowing函数(虽然这似乎有用,但我不确定它应该如何)。