Skip to content

Instantly share code, notes, and snippets.

@pschumm
Created October 7, 2014 00:06
Show Gist options
  • Star 11 You must be signed in to star a gist
  • Fork 4 You must be signed in to fork a gist
  • Save pschumm/b967dfc7f723507ac4be to your computer and use it in GitHub Desktop.
Save pschumm/b967dfc7f723507ac4be to your computer and use it in GitHub Desktop.
Wrapper for "stata -b" which issues an informative error msg and appropriate (i.e., non-zero) return code
#! /bin/bash
# Wrapper for "stata -b" which issues an informative error msg and appropriate
# (i.e., non-zero) return code
# The basic idea for this script (including grepping the log file to determine
# whether there was an error) was taken from a similar script posted by Brendan
# Halpin on his blog at http://teaching.sociology.ul.ie/bhalpin/wordpress/?p=122
args=$# # number of args
cmd=""
if [ "$1" = "do" ] && [ "$args" -gt 1 ]
then
log="`basename -s .do "$2"`.log"
# mimic Stata's behavior (stata-se -b do "foo bar.do" -> foo.log)
log=${log/% */.log}
# Stata requires explicit -do- command, but we relax this to permit just the
# name of a single do-file
elif [ "$args" -eq 1 ] && [ "${1##*.}" = "do" ] && [ "$1" != "do" ]
then
cmd="do"
log="`basename -s .do "$1"`.log"
log=${log/% */.log}
else
# else Stata interprets it as a command and logs to stata.log
log="stata.log"
fi
# in batch mode, nothing sent to stdout (is this guaranteed?)
stderr=`stata-se -b $cmd "$@" 2>&1`
rc=$?
if [ -n "$stderr" ] # typically usage info
then
echo "$stderr"
exit $rc
elif [ $rc != "0" ]
then
exit $rc
else
# use --max-count to avoid matching final line ("end of do-file") when
# do-file terminates with error
if egrep --before-context=1 --max-count=1 "^r\([0-9]+\);$" "$log"
then
exit 1
fi
fi
@bquistorff
Copy link

Great code. One note is that compiled plugins can output to stdout even in batch mode. The current version of -synth- outputs lots of debugging info. For long jobs I pipe the output through "tail -100 " so that it doesn't create huge files.

@nickeubank
Copy link

@pschumm you're my hero.

@kylebarron
Copy link

This is great! It's crazy that Stata doesn't output correct return codes.

@kylebarron
Copy link

I ended up finding it easier having a simple script checklog.sh:

#! /usr/bin/env bash
if egrep --before-context=1 --max-count=1 "^r\([0-9]+\);$" "${1:-/dev/stdin}"
then
    exit 1
else
    exit 0
fi

and then just running it after calling stata -b, like so:

stata -b do script.do; bash checklog.sh script.log

This is nice because it also supports reading the log from stdin. So if I'm running dyntext on a file, I'll do:

stata < <(echo "dyntext file.domd, saving(file.md)") | bash checklog.sh

and it'll still catch any errors.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment