Выполнять команды 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
и теперь это работает.