Bash eval$(docker机器环境默认值)在iterm启动脚本中不工作

Bash eval$(docker机器环境默认值)在iterm启动脚本中不工作,bash,shell,docker,Bash,Shell,Docker,我有一个iterm的启动脚本,如果缺少,它会启动docker vm,如果已经存在,则会连接到它 iterm\u 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 $cm

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

iterm\u 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机器环境默认值)
的块。但是,当我转到终端时,它仍然没有连接到docker vm。我必须再次在shell中手动运行
eval$(docker machine env default)


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

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

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

查看您的脚本,我怀疑您可以使使用变得更简单,并且我怀疑您需要执行“eval”步骤,即使机器尚未运行

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

非常感谢您花时间详细解释子流程并提出改进建议!非常感谢:D
MACHINE=default
if [ $(docker-machine status "$MACHINE" 2>&1) != "Running" ]; then
  docker-machine start "$MACHINE"
fi
eval $(docker-machine env "$MACHINE")