2016-07-21 11 views
0

Beim Versuch, den Fehler eines Befehls in einem Makefile (in diesem Fall jekyll build relative) zu testen, sollte die Variable $$? den Exit-Code des letzten Befehls enthalten. Beim Testen wird dieser Code mit 127 angezeigt. Ich möchte ihn jedoch der Variablen LAST_EXIT zuweisen, damit eine nächste if-Anweisung prüfen kann, ob der ausgeführte Befehl erfolgreich war oder fehlgeschlagen ist.Wie kann man der Variablen im Makefile einen Wert zuweisen?

Das Problem ist, dass LAST_EXIT nie den Wert erhält, der zugewiesen wird, wie im folgenden Code gezeigt. Irgendwelche Vorschläge, wie Sie dieses Problem beheben können?

Code:

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 

Ausgang:

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 

Antwort

0

Es gibt zwei Probleme mit Ihrem Ansatz.

1) Machen Sie auflösbare Teile des Makefiles, bevor es eine Regel ausführt. Dies:

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

nicht Erfolg berichten (es sei denn, Sie den Wert LAST_EXIT irgendwo über dem Regelsatz).

2) Jeder Befehl in einem Rezept wird in einer eigenen Subshell ausgeführt; Shell-Variablenwerte werden nicht von einer Zeile zur nächsten erhalten:

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

Diese Arbeit sollte:

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

Dank für Ihre Hilfe danken ich glaube, ich bin ein anderes System, als Sie mit einem Daher lief der Makefile-Code in folgendem Fehler: '/ bin/sh: Zeile 0: [: ==: unärer Operator erwartet 'Ich habe dieses Problem gelöst, indem ich ein Skript geschrieben habe, das prüft, ob Jekyll installiert ist oder nicht. Das 'if ... fi'-Format funktioniert in meinem Bash-Skript gut, obwohl ich den Gleichheitstest modifizieren musste. –

0

dieses Problems Meine Lösung das folgende Skript in der Datei Makefile wurde fordern Jekyll zu überprüfen : (genannt als ./{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 
Verwandte Themen