【问题标题】:Eval in fish shell function working strange鱼壳功能中的 eval 工作奇怪
【发布时间】:2015-11-27 05:17:29
【问题描述】:

我试图对 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 代码 - 在该别名按预期工作之后。

那么,到底是怎么回事,有人有什么想法吗?

【问题讨论】:

    标签: fish


    【解决方案1】:

    看起来 Docker 的输出没有指定明确的范围,所以当你在函数中运行它并且这些变量没有在其他地方定义时,它们最终会在函数的范围内。

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

    documentation for set

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

    1. 如果变量显式设置为通用、全局或局部, 该设置将得到尊重。如果存在同名变量 不同的范围,该变量不会改变。

    2. 如果变量未明确设置为通用、全局或 本地,但之前已经定义,之前的变量范围是 用过。

    3. 如果变量未明确设置为通用、全局或 local 并且以前从未定义过,该变量将是本地的 当前执行的函数。请注意,这与 使用 -l 或 --local 标志。如果使用这些标志之一,则 变量将是当前执行的最内部块的本地变量, 而没有这些变量将是函数的本地变量。如果不 函数正在执行,变量将是全局的。

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

    【讨论】:

    • 这是一个 hack:修改输出以指定全局范围:eval (docker-machine env $argv | sed 's/^set /set -g /')
    猜你喜欢
    • 1970-01-01
    • 2014-04-24
    • 1970-01-01
    • 1970-01-01
    • 2013-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多