2016-07-21 13 views
0

Makefile(この場合はjekyll build relative)でコマンドの失敗をテストしようとすると、変数$$?に最後のコマンドの終了コードが含まれているはずです。テストでは、このコードは127で示されています。しかし、変数LAST_EXITに割り当てると、次のif文で実行されたコマンドが成功したか失敗したかを確認できます。Makefileの変数に値を割り当てる方法は?

LAST_EXITは、以下のコードに示すように、割り当てられている値を受け取らないという問題があります。どのようにこの問題を解決するための任意の提案?

コード:

LAST_EXIT = 0 

all: 
    @echo "Building the website... Running command:" 
    - jekyll build relative || LAST_EXIT=$$? 
    - jekyll build relative || echo $$? and $(LAST_EXIT) 
ifeq ($(LAST_EXIT), 0) 
    #echo a message indicating success 

出力:あなたのアプローチには二つの問題があります

jekyll build relative || LAST_EXIT=$? 
/bin/sh: jekyll: command not found 
jekyll build relative || echo $? and 0 
/bin/sh: jekyll: command not found 
127 and 0 

答えて

0

1)makeは、ルールを実行する前にmakefileの条件付き部分を解決します。この:(ルール上のLAST_EXITどこかの値を設定しない限り)

all: 
    LAST_EXIT=0 
ifeq ($(LAST_EXIT), 0) 
    #echo a message indicating success 
endif 

は成功を報告しません。

2)レシピ内の各コマンドは、それ自身のサブシェルで実行されます。シェル変数の値がは、次の1行から保存されていません。

all: 
    LAST_EXIT=5; echo the value is $$LAST_EXIT 
    @echo now the value is $$LAST_EXIT 

これは動作するはずです:

all: 
    - jekyll build relative || LAST_EXIT=$$?; \ 
    if [ $$LAST_EXIT == 0 ]; then echo success!; fi 
+0

はあなたの助けをありがとう、私はあなたよりも別のシステムを使用していると思います! '/ bin/sh:line 0:[:==:単項演算子が期待されていました] Jekyllがインストールされているかどうかをチェックするスクリプトを書くだけで、この問題を解決しました。 'if ... fi'フォーマットはbashスクリプトでうまく動作しますが、同等性テストを修正する必要がありました。 –

0
この問題に対する私のソリューションは、ジキルをチェックするためにMakefileの次のスクリプトを呼び出していました

./{scriptNameと呼ばれる (}

#!/bin/bash 

LINEBREAK="*****************************************************************" 
VERSION=0 

echo "Checking Jekyll..." 
VERSION=$(jekyll --version) 

if test "$?" == "0" 
then 
    echo "$VERSION is installed on this system..." 
else 
    echo "$LINEBREAK" 
    echo "Oops! It looks like you don't have Jekyll yet, lets install it!" 
    echo "Running command: \"sudo gem install jekyll\"" 
    echo "$LINEBREAK" 
    sudo gem install jekyll 
    if test "$?" != "0" 
    then 
      echo "$LINEBREAK" 
      echo "Jekyll install failed... It needs to be installed as a super-user on your system, which" 
      echo "requires your password. You can run \"sudo gem install jekyll\" yourself to install Jekyll." 
      echo "You can also see their website at: \"https://jekyllrb.com/docs/installation/\" for more information" 
      echo "$LINEBREAK" 
      exit 113 
    else 
      echo "$LINEBREAK" 
      echo "Jekyll has been installed on this system..." 
      echo "Proceeding to build..." 
      echo "$LINEBREAK" 
    fi 
fi 

exit 0 
関連する問題