diff options
Diffstat (limited to 'examples/scripts.v2/shprof')
-rw-r--r-- | examples/scripts.v2/shprof | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/examples/scripts.v2/shprof b/examples/scripts.v2/shprof new file mode 100644 index 0000000..73a1bb9 --- /dev/null +++ b/examples/scripts.v2/shprof @@ -0,0 +1,66 @@ +#! /bin/bash +# +# shprof - a line profiler for shell scripts +# +# adapted from a similar program included in `The New KornShell' by +# Bolsky and Korn and posted to usenet by bsh20858@challenger.fhda.edu +# +# converted to bash v2 syntax by Chet Ramey +# +TMPFILE=${TMP:-/tmp}/shprof$$ + +trap 'rm -f $TMPFILE' EXIT + +errexit() +{ + echo $0: "$@" >&2 + exit 1 +} + +# create script with profiling enabled +cat > $TMPFILE <<- \_EOF_ + declare -a _line + _profend() + { + case "$1" in + /*|./*) file="$1" ;; + *) file=$(type -path "$1") ;; + esac + + echo "*** line profile for $file ***" + i=1; + while read -r && [ $i -le $NLINE ]; do + count=${_line[$i]} + if [ "$count" -gt 0 ]; then + echo "[$count] $i: $REPLY" + fi + i=$((i + 1)) + done <$file +_EOF_ +# make the profiling script remove itself after printing line stats +echo "rm -f $TMPFILE" >> $TMPFILE +cat >> $TMPFILE <<- \_EOF_ + } + _command=$1 + shift + i=1 + NLINE=$(wc -l < "$_command") + while [ $i -le $NLINE ]; do + _line[$i]=0 + i=$((i + 1)) + done + unset i + trap "_profend ${_command}" EXIT + trap '_line[$LINENO]=$((${_line[$LINENO]} + 1))' DEBUG + LINENO=0 +_EOF_ + +case "$1" in +/*|./*) file=$1 ;; +*) file=$((type -path "$1")) ;; +esac + +cat "${file-$1}" >> $TMPFILE || errexit "${1}: cannot open" +chmod +x $TMPFILE + +exec -a "$file" $TMPFILE "$@" |