help-make
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Problems with status.


From: Paul D. Smith
Subject: Re: Problems with status.
Date: Thu, 13 Apr 2006 16:14:19 -0400

%% "PATTON, BILLY \(SBCSI\)" <address@hidden> writes:

  pb> I may have 10 lines in my command but all are ; \  to make one process.

Not good.

  pb> example
  pb> target :
  pb>   @for X in variable ; do \
  pb>     if [ -f $$$$X ] ; then \
  pb>       $(EXEC_LOG) some_scommand ; \
  pb>     fi ; \
  pb>   done ; \
  pb>   $(DO_SOMETHING) ;\
  pb>   if [ a = b ] ; then \
  pb>      bla bla bla ; \
  pb>   fi 

  pb> EXEC_LOG is failing but make is continuing to run.  As I understand it
  pb> the last ; wins.

To be precise, the exit code from a shell script is the exit code of the
last command executed in the script.

Unless you explicitly call exit with a different value.

  pb> This came to me through the K's of defunct processes.  

  pb> Do I have to do something like
  pb>   stat=0; \
  pb> @for X in xxx ; do \
  pb>   $(EXEC_LOG) ...
  pb>   let stat=stat+$?
  pb> ...
  pb> fi ; \
  pb> $$stat

This won't work.  It will just try to run the command "0" or "1" or
whatever, which certainly doesn't exist.

  $ /bin/sh -c 'stat=0; $stat'
  /bin/sh: 0: command not found

This is the shell, not Perl.


Do you really want to continue to run the rest of the command once
something fails?  If so you'll have to do something similar to what you
suggest.

But, if you want to stop as soon as something bad happens you have two
choices: either exit immediately, or use "set -e" in your shell scripts
to tell the shell to exit as soon as some command fails (see the
documentation for your shell to know what this means).

First example:

 target :
       @for X in variable ; do \
         if [ -f $$$$X ] ; then \
           $(EXEC_LOG) some_scommand || exit $? ; \
         fi ; \
       done ; \
       $(DO_SOMETHING) || exit $? ; \
       if [ a = b ] ; then \
          bla bla bla || exit $? ; \
       fi


Second example

 target :
       @set -e; \
        for X in variable ; do \
         if [ -f $$$$X ] ; then \
           $(EXEC_LOG) some_scommand ; \
         fi ; \
       done ; \
       $(DO_SOMETHING) ; \
       if [ a = b ] ; then \
          bla bla bla ; \
       fi

Note that neither of this is effective if your commands are in a
pipeline and one of them fails:

    foo | bar | baz

and "bar" fails... this is very, very hard to deal with in normal Bourne
shell.

-- 
-------------------------------------------------------------------------------
 Paul D. Smith <address@hidden>          Find some GNU make tips at:
 http://www.gnu.org                      http://make.paulandlesley.org
 "Please remain calm...I may be mad, but I am a professional." --Mad Scientist




reply via email to

[Prev in Thread] Current Thread [Next in Thread]