首页 > 解决方案 > eval $(docker-machine env default) 在 iterm 启动脚本中不起作用

问题描述

我有一个 iterm 的启动脚本,如果缺少它会启动一个 docker vm,如果它已经存在则连接到它。

iterm 配置

iterm_startup.sh

#!/bin/bash

typeset cmnd="docker-machine ls --filter name='default' --filter state='stopped' | grep default"
typeset ret_code

echo "running startup script ===> ${cmnd}"
eval $cmnd
ret_code=$?

# If not 0, means docker vm has already started
if [ $ret_code != 0 ]; then
    eval $(docker-machine env default)
# If 0, means defai;t docker vm not yet started
elif [ $ret_code == 0 ]; then
    docker-machine start default
fi

当 docker 机器存在时,它会进入运行的块eval $(docker-machine env default)。但是,当我去终端时,它仍然没有连接到 docker vm。我必须eval $(docker-machine env default)再次在 shell 中手动运行。

有人可以帮我理解为什么eval $(docker-machine env default)在脚本中不能按预期工作吗?:)

标签: bashshelldocker

解决方案


从您显示的设置来看,您似乎要求 iTerm “输入”脚本的路径,并在新的终端窗口打开时作为第一件事运行它。发生这种情况时,脚本将作为子进程运行。如果您查看docker-machine env打印出来的内容,它只是一组exportshell 命令,所以现在您偶然发现了子进程不能影响其父进程的环境的一般规则。

简单的答案是将命令更改为“源”您的脚本,以便它在终端外壳的上下文中运行。尝试将“在开始时发送文本”更改为

. ~/scripts/iterm_startup.sh

查看您的脚本,我怀疑您可以使用docker-machine status使其更简单,并且我怀疑即使机器尚未运行,您也需要执行“评估”步骤。

MACHINE=default
if [ $(docker-machine status "$MACHINE" 2>&1) != "Running" ]; then
  docker-machine start "$MACHINE"
fi
eval $(docker-machine env "$MACHINE")

推荐阅读