我有一个iterm的启动脚本,如果缺少,它将启动一个docker vm,如果已经存在,则连接到它。
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)
在脚本中无法正常工作吗? :)
答案 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")