eval $(docker-machine env默认值)在iterm启动脚本中不起作用

时间:2018-08-06 07:57:38

标签: bash shell docker

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

iterm configuration

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)

有人可以帮助我理解为什么eval $(docker-machine env default)在脚本中无法正常工作吗? :)

1 个答案:

答案 0 :(得分:2)

根据显示的设置,您似乎在要求iTerm“键入”脚本的路径,并在打开新的终端窗口时首先运行它。发生这种情况时,脚本将作为子进程运行。如果您查看docker-machine env输出的内容,只是一组export shell命令,那么现在您偶然发现了一般规则,即子进程不能影响其父母的环境。

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

. ~/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")