gpt4 book ai didi

bash - 在 bash 脚本中执行 gcloud 命令

转载 作者:行者123 更新时间:2023-12-05 04:13:52 25 4
gpt4 key购买 nike

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 脚本执行期间获得登录提示?

最佳答案

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

正确的片段(可能)是:

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

原始错误的第一个错误是您自己发现的(至少是错误的原因而不是原因),是 exec -l $SHELL 阻碍了进程。之所以这样做,是因为您已经运行了一个交互式 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 然后获取它的输出并用它替换命令”然后它将尝试将输出作为命令本身运行(这是可能不是你想要的)。其他线路也是如此。

虽然 chown 和可能的 gcloud init 没有返回任何内容,因此生成的命令行是空的,但这里碰巧没有问题。

关于bash - 在 bash 脚本中执行 gcloud 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36423533/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com