2016-04-05 21 views
2

gcloud initコマンドは、bashスクリプトの実行中にログイン・プロンプトを表示しません。bashスクリプトでgcloudコマンドを実行

しかし、スクリプト終了後に手動で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)? 

私の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スクリプトの実行中にログインプロンプトを取得できますか?

+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 \' 'が必要な場合がありますが、わかりませんそれ。現在のシェルでこれらのコマンドを実行したいだけです。だから、普通のコマンドのように書くだけです。新しいシェルセッションを必要としないので、新しいシェルを実行しないでください( 'exit'する必要があります)。 –

答えて

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はバッククォートが追加されたサブシェルを置き換えただけなので、安全に終了して親/メインスクリプトに戻る子プロセスが残っていました。

2番目の問題は、バックティックは、それらが囲むコマンドを実行してから、自分自身を出力に置き換えることです。これはなぜ

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に変更しました。

関連する問題