我尝试使用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代码 - 在该别名按预期工作之后。
那么,最重要的是,任何人都有任何想法吗?
答案 0 :(得分:2)
看起来Docker的输出没有指定显式范围,所以当你在函数中运行它并且那些变量没有在其他地方定义时,它们将最终进入函数的范围。
但是,如果从命令提示符运行相同的代码,最终将在全局范围内定义变量,然后由函数中的set
更新。
创建或更新变量时的范围规则是:
如果变量显式设置为通用,全局或本地, 该设置将受到尊重。如果存在同名变量 在不同的范围内,该变量不会被更改。
如果未将变量显式设置为universal,global或 本地,但先前已定义,以前的变量范围是 使用
- 醇>
如果未将变量显式设置为universal,global或 本地且从未定义过,变量将是本地变量 当前正在执行的功能。请注意,这与...不同 使用-l或--local标志。如果使用其中一个标志,则 变量将是当前最内部执行块的本地变量, 而没有这些变量将是函数的本地变量。如果不 函数正在执行,变量将是全局的。
要解决此问题,请尝试使用cdm
定义--no-scope-shadowing
函数(虽然这似乎有用,但我不确定它应该如何)。