Выполнять команды gcloud в скрипте bash

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 ответа

Решение

Есть много проблем с размещенным фрагментом.

Правильный фрагмент (вероятно):

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

Первая ошибка с оригиналом, которую вы обнаружили сами (что из этого, по крайней мере, не почему), заключается в том, что exec -l $SHELL блокирует прогресс Это происходит потому, что вы запустили интерактивную оболочку, которая теперь ожидает от вас ввода, а функция ожидает завершения этого процесса, прежде чем продолжить.

Дополнительно, exec заменяет текущий процесс порожденным процессом. Тебе повезло на самом деле здесь. Если бы вы не завершили звонок exec в одинарных кавычках ваша функция полностью вышла бы из сценария оболочки при выходе из $SHELL это запущено. Как это, однако, exec просто заменили вложенную оболочку, которую добавили обратные метки, и у вас остался дочерний процесс, который мог бы безопасно завершить работу и вернуть вас в родительский / основной скрипт.

Вторая проблема заключается в том, что обратные галочки запускают команду, которую они окружают, а затем заменяют себя выводом. Вот почему

echo "bar `echo foo` baz"

выходы bar foo bazи т. д. set -x перед запуском, чтобы увидеть, какие команды на самом деле выполняются.) Так что, когда вы пишете

`gcloud init --console-only`

то, что вы говорите, "беги gcloud init --console-only затем возьмите его вывод и замените команду на ", которая затем попытается запустить вывод как саму команду (что, вероятно, не то, что вы хотели). Аналогично в других строках.

Это, как оказалось, не было проблематичным здесь, хотя как chown и вероятно gcloud init ничего не возвращать и поэтому полученная командная строка пуста.

Каким-то образом exec -l $SHELL сделал все беспорядок. Я изменил это на source ~/.bashrc и теперь это работает.

Другие вопросы по тегам