bash - eval $(docker-machine env default) 在 iterm 启动脚本中不起作用
问题描述
我有一个 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)
再次在 shell 中手动运行。
有人可以帮我理解为什么eval $(docker-machine env default)
在脚本中不能按预期工作吗?:)
解决方案
从您显示的设置来看,您似乎要求 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")
推荐阅读
- javascript - 如何确保分析数据来自它声称来自的服务器?
- javascript - 在 Yii2 中通过 jQuery 获取单选按钮的值
- arrays - 寻找通过数组的最低价格的算法
- authentication - 在 cakephp 3.6 中,如何更改身份验证组件的用户查找器查询?
- android - Gradle 错误:用于编码 UTF-8 的不可映射字符
- mysql - 删除用户时在 mysql 的主机名中转义 @
- java - 休眠和 ZonedDateTime
- python - 我被要求在python中编写一个函数(使用年金公式的现值)
- python - AttributeError: 'NoneType' 对象没有属性 'tbody' - Spyder 3.3.1 / beautifulsoup4 / python 3.6
- arrays - 如何从 Kotlin 中的 ArrayList 中删除项目