在bash脚本中执行gcloud命令

时间:2016-04-05 10:17:28

标签: bash gcloud

gcloud init命令在bash脚本执行期间不提供登录提示。

但是在脚本结束后手动输入exit命令后,它提供了登录。

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)?  

我的bash脚本:

#!/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

如何在执行bash脚本期间获取登录提示?

2 个答案:

答案 0 :(得分:2)

已发布的代码段存在许多问题。

正确的片段(可能):

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

您自己发现的原始文件的第一个错误(至少它不是为什么),exec -l $SHELL阻止了进度。这样做是因为您运行了一个交互式shell,现在正在等待您输入,并且该函数正在等待该进程退出,然后再继续。

此外,exec用生成的进程替换当前进程。你真的很幸运。如果您没有用单引号将exec的调用包裹起来,那么当您退出它发起的$SHELL时,您的函数将完全退出shell脚本。但是,exec只是替换了反引号添加的子shell,因此您可以使用子进程,可以安全地退出并返回到父/主脚本。

第二个问题是反引号运行它们所包含的命令,然后用输出替换它们自己。这就是为什么

echo "bar `echo foo` baz"

输出bar foo baz等(在运行之前运行set -x以查看实际运行的命令。)所以当你写

`gcloud init --console-only`

你所说的是"运行gcloud init --console-only然后取出它的输出并用#34;替换命令。然后,它将尝试将输出作为命令本身运行(这可能不是您想要的)。同样在其他方面。

虽然chown可能gcloud init并且onerror没有返回任何内容,因此生成的命令行为空,但这种情况不存在问题。

答案 1 :(得分:1)

不知怎的,exec -l $SHELL做了所有混乱。我将其更改为source ~/.bashrc,现在可以正常使用。