简体   繁体   中英

Execute gcloud commands in a bash script

gcloud init command doesn't offer login prompt during a bash script execution.

But it offered the login after I typed exit command manually after script ended.

vagrant@vagrant-ubuntu-trusty-64:~$ exit
logout
Welcome! This command will take you through the configuration of gcloud.

Settings from your current configuration [default] are:
Your active configuration is: [default]


Pick configuration to use:
 [1] Re-initialize this configuration [default] with new settings 
 [2] Create a new configuration
Please enter your numeric choice:  1

Your current configuration has been set to: [default]

To continue, you must log in. Would you like to log in (Y/n)?  

My bash script:

#!/usr/bin/env bash

OS=`cat /proc/version`

function setupGCE() {
curl https://sdk.cloud.google.com | bash
`exec -l $SHELL`
`gcloud init --console-only`
`chown -R $USER:$USER ~/`
}


if [[ $OS == *"Ubuntu"* || $OS == *"Debian"*  ]]
then
sudo apt-get -y install build-essential python-pip python-dev curl
sudo pip install apache-libcloud
setupGCE
fi

How can I get the login prompt during the bash script execution?

There are a number of issues with the posted snippet.

The correct snippet is (probably):

function setupGCE() {
    curl https://sdk.cloud.google.com | bash
    gcloud init --console-only
    chown -R $USER:$USER ~/
}

The first error with the original, which you discovered yourself (the what of it at least it not the why), is that exec -l $SHELL is blocking progress. It does that because you've run an interactive shell that is now waiting on you for input and the function is waiting for that process to exit before continuing.

Additionally, exec replaces the current process with the spawned process. You got lucky here actually. Had you not wrapped the call to exec in single quotes your function would have exited the shell script entirely when you exited the $SHELL it launched. As it is, however, exec just replaced the sub-shell that the backticks added and so you were left with a child process that could safely exit and return you to the parent/main script.

The second issue is that backticks run the command they surround and then replace themselves with the output. This is why

echo "bar `echo foo` baz"

outputs bar foo baz , etc. (Run set -x before running that to see what commands are actually being run.) So when you write

`gcloud init --console-only`

what you are saying is "run gcloud init --console-only then take its output and replace the command with that" which will then attempt to run the output as a command itself (which is likely not what you wanted). Similarly on the other lines.

This happens to not have been problematic here though as chown and likely gcloud init don't return anything and so the resulting command line is empty.

Somehow the exec -l $SHELL did all the mess. I changed it to source ~/.bashrc and now it works.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM