Reputation: 4811
I have a startup script for iterm that starts a docker vm if missing, and connects to it if it already exists.
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
When a docker machine exists, it goes into the block that runs eval $(docker-machine env default)
. However, when I go to the terminal, it still hasn't connected to the docker vm. I have to manually run eval $(docker-machine env default)
in the shell again.
Can someone help me understand why eval $(docker-machine env default)
doesn't work as expected in a script? :)
Upvotes: 1
Views: 740
Reputation: 159781
From the settings you showed, it looks like you're asking iTerm to "type in" the path to your script and run it as the first thing when a new terminal window opens. When that happens the script runs as a subprocess. If you look at what docker-machine env
prints out it's just a set of export
shell commands, so now you stumble on the general rule that subprocesses can't affect their parents' environments.
The simple answer is to change the command to "source" your script so that it runs in the context of the terminal's shell. Try changing your "send text at start" to
. ~/scripts/iterm_startup.sh
Looking at your script, I suspect you could make it much simpler using docker-machine status, and I suspect you need to do the "eval" step even if the machine isn't running yet.
MACHINE=default
if [ $(docker-machine status "$MACHINE" 2>&1) != "Running" ]; then
docker-machine start "$MACHINE"
fi
eval $(docker-machine env "$MACHINE")
Upvotes: 3