2016-04-05 4 views
2

gcloud init команда не предлагает приглашение для входа во время выполнения сценария bash.Выполнение команд gcloud в сценарии bash

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

[email protected]:~$ 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)? 

Мой Баш скрипт:

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

Как я могу получить приглашение для входа во время выполнения Баш скрипт?

+1

Каждая команда backtick-ed запускается в собственной оболочке. Поэтому они не взаимодействуют (в частности, независимо от того, что «gcloud init --console-only» не повлияет на последующие оболочки). Кроме того, обратные ссылки здесь просто неправильны. Они запускают внутреннюю команду, а затем пытаются запустить * вывод * из этих команд в виде команд. –

+0

@EtanReisner, что вы предлагаете? Поместить все команды в одну команду назад? Например, backtick'exec -l $ SHELL && gcloud init --console-only && chown -R $ USER: $ USER ~/'backtick? – trex

+0

Нет, вам вообще не нужны обратные сигналы. Они просто ошибаются ...если только 'gcloud init --console-only' выплевывает строки, которые нужны текущей оболочке для запуска, в этом случае вам может понадобиться' eval \ gcloud init --console-only \ '', но я не знаю, что это делает что. Вы просто хотите запустить эти команды в своей текущей оболочке. Поэтому просто напишите их, как обычные команды. И не запускайте новую оболочку (тогда вам нужно «выйти»), так как вам не нужен новый сеанс оболочки. –

ответ

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 просто заменил под-оболочку, добавленные обратными записями, и поэтому вы остались с дочерним процессом, который мог бы безопасно выйти и вернуть вас к исходному/основному скрипту.

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

echo "bar `echo foo` baz" 

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

`gcloud init --console-only` 

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

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

1

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

Смежные вопросы