2016-10-03 14 views
1

私はAmazonのCLIを使って静的コンテンツをs3バケットに配布するためにmakefileを使用しています。変数を入れてターゲット先を選択したいので、別のmake動詞で同じスクリプトを繰り返す必要はありません。メイクファイル内の上位変数

私はうまくいくように思えますが、実行時に端末から大文字小文字を区別しないようにしたいと思います。ここで私が持っているものです。

S3_NAME_DEV = com-mydomain-application-dev 
S3_NAME_LIVE = com-mydomain-application 
deploy: 
    # e.g. make deploy t=LIVE 
    aws s3 sync dist/ s3://$(S3_NAME_${t}) 

私は(bashの4でサポートされており、私が使用している)2つのキャレット$(S3_NAME_${t^^})を追加しようとしたが動作しません:/。 $ make deploy t=live(変数が消えてしまう)の出力は次のとおりです。

$ make deploy t=live 
# e.g. make deploy t=LIVE 
aws s3 sync dist/ s3:// 

私はAWSコマンドは(AWS CLIを知らないようにすると、あなたをオフにスローされません)のように見えるかもしれないものを含めるように役に立つかもしれないと思いました。

$ t=live 
$ echo ${t^^} 
LIVE 

任意の助けをいただければ幸いです:私はこれを正常に行うことができますからmakeを呼び出すシェルで

aws s3 sync dist/ s3://com-mydomain-application 

ボーナスポイント:デフォルト設定値

UPDATE:

は、だから私は仮定のようにそれを実行bashのを継承しませんします。私が@echo "my version is: $$BASH_VERSION"をmakeファイルに入れたら、バージョン3.2(OS Xのデフォルト)が得られます。これを修正すれば、問題は解決します。

+0

を。私は投稿を編集しました。 – freebie

+0

probsはありません、あなたはすべてのキャップを与える場合は動作しますか? – Sundeep

+0

@Sundeep一度 '^^'をインクルードすると、 't = live'または' t = LIVE'のどちらかで空の値が与えられます。 '^^'を削除すると、 '$ make deploy t = LIVE'が再び動作します。 – freebie

答えて

0

私は(bashの4でサポートされており、私が使用している)2つのキャレット$(S3_NAME_${t^^})を追加しようとしたが動作しません。

あなたは${t^^}部分はbashによって拡張されることを期待するのに対し、$(S3_NAME_...)部分は、メイクによって拡張されているが、makeは変数を展開するときbashが関与していないためです。

早くあなたのメイクファイルで大文字にtを変換します

override t := $(shell X="${t}"; echo $${X^^}) 

overrideがなければ、それは新しい変数名が必要になります。私はそれが含まれていませんでした申し訳ありません@Sundeep

u := $(shell X="${t}"; echo $${X^^}) 
# use ${u} instead of ${t} 
+0

これはうまくいきますが、makeスクリプトは以前に実行された行のコンテキストを持っていないようですので、インラインですべて実行する必要があります。つまり、aws s3 sync dist/s3:// S3_NAME_ $(shell X = "$ {t} "; echo $$ {X ^^})'。私は正しいのですか? – freebie

+0

@freebie _ makeスクリプトは、以前に実行された行のコンテキストを持っていないようです - そうはいけません。他のmakefileを呼び出す場合は、変数を 'export 'してください。 'export u:= ...'と '$ {t}'の代わりに '$ {u}'を使います。 –

+0

変数の代入の前にエクスポートを置いてみましたが、うまく動作していないようです。私の電話で申し訳ありませんので、手元にはエラーがありません。この回答は正しいですが、私の問題を解決しました。私は、make変数の有効範囲は別の問題だと思います。ありがとう – freebie

関連する問題