joel
joel

Reputation: 7867

equivalent of exit on command line

I have a bash script that runs a series of python scripts. It always runs all of them, but exits with a failure code if any script exited with a failure code. At least that's what I hope it does. Here it is ...

#!/bin/bash

res=0

for f in scripts/*.py
do
  python "$f";
  res=$(( $res | $? ))
done

exit $res

I'd like to run this as a bash command in the terminal, but i can't work out how to replace exit so that the command fails like a failed script, rather than exits the terminal. How do I do that?

Upvotes: 2

Views: 291

Answers (4)

petrus4
petrus4

Reputation: 614

#!/bin/bash

for f in scripts/*.py
do
  python "$f" && echo "1" >> stack || echo "0" >> stack
done

[ $(grep -o stack) -eq 0 ] && rm -v ./stack && exit 1

I am rather stoned at the moment, so I apologise if I am misinterpreting, but I believe that this will do what you need. Every time the python script returns an error code of 0, (which means it works) a 1 is echoed into a stack file. At the end of the loop, the stack is checked for the presence of a single 0, and if it finds one, exits with an error code of 1, which is for general errors.

Upvotes: 0

Wiimm
Wiimm

Reputation: 3502

Is it true, that the value of the error code doesn't matter. Then I have another solution:

#!/bin/bash
total=0
errcount=0

for f in scripts/*.py
do
  let total++
  python "$f" || let errcount++
done

if ((errcount))
then
  printf '%u of %u scripts failed\n' $errcount $total >&2 
  exit 1
fi

exit 0

Upvotes: 0

JGK
JGK

Reputation: 4158

Replace your last line exit $res with

$(exit ${res})

This exits the spawned subshell with the exit value of ${res} and because it is the last statement, this is also the exit value of your script.

Upvotes: 3

Inian
Inian

Reputation: 85560

Bash doesn't have a concept of anonymous functions (e.g. Go) which you can defined inline and get the return value, you need to do it explicitly. Wrap the whole code in a function say f()

f() {
    local res=0
    
    for f in scripts/*.py
    do
      python "$f";
      res=$(( $res | $? ))
    done

    return $res
}

and use the exit code in command line.

if ! f; then
    printf '%s\n' "one more python scripts failed"
fi

Upvotes: 2

Related Questions