Meganuke

DO NOT MERGE YET!!!
Personally, I prefer `-e` because it means my scripts are perfect, but I expect it's going to cause a headache here. If you're interested in it though then I say let's use it, but with one major exception -- we absolutely need a trap on ERR and to enable errtrace, because this quote is currently impossible: 

> below we will print out what happened in the script

To enable this, you need to set a trap on ERR. 

Here's an example of the complexity issues, notice that simply having a single command that returns non-zero (false) causes immediate script exit with a return code equal to the non-zero'ed command

    $ cat test.sh
    #!/bin/bash -e
    echo alive
    false
    echo still alive
    $ ./test.sh
    alive
    $ echo $?
    1

Now here I've updated to include a simple trap on ERR, and we can get a nice debug output telling us what went wrong with the script. You can get pretty fancy with the error traps - I've got one lying around somewhere that prints a full stack trace for the bash including line numbers and file names that might be helpful. 

    $ cat test.sh 
    #!/bin/bash -e
    
    err_report() {
      echo "Error on line $1"
    }
    trap 'err_report $LINENO' ERR
    
    echo alive
    false
    echo still alive
    $ ./test.sh
    alive
    Error on line 10

This is clearly much better, but we need to define the ERR trap inside our python code and then have it be inherited by the bash script (otherwise every start.sh file would need to redefine the standard ERR trap). To enable traps to be inherited you have to pass the errtrace option `-E` to bash, so your full command would look something like this: 
   
    subprocess.check_call('sudo -u %s -E -H bash -E -e <define ERR trap> && <trap ERR to defined function> && %s.sh'