| 1 | #! /bin/bash |
|---|
| 2 | # |
|---|
| 3 | # shprof - a line profiler for shell scripts |
|---|
| 4 | # |
|---|
| 5 | # http://www.math.ias.edu/doc/bash-3.0/scripts.v2/shprof |
|---|
| 6 | # |
|---|
| 7 | # adapted from a similar program included in `The New KornShell' by |
|---|
| 8 | # Bolsky and Korn and posted to usenet by bsh20858@challenger.fhda.edu |
|---|
| 9 | # |
|---|
| 10 | # converted to bash v2 syntax by Chet Ramey |
|---|
| 11 | # |
|---|
| 12 | TMPFILE=${TMP:-/tmp}/shprof$$ |
|---|
| 13 | |
|---|
| 14 | trap 'rm -f $TMPFILE' EXIT |
|---|
| 15 | |
|---|
| 16 | errexit() |
|---|
| 17 | { |
|---|
| 18 | echo $0: "$@" >&2 |
|---|
| 19 | exit 1 |
|---|
| 20 | } |
|---|
| 21 | |
|---|
| 22 | # create script with profiling enabled |
|---|
| 23 | cat > $TMPFILE <<- \_EOF_ |
|---|
| 24 | declare -a _line |
|---|
| 25 | _profend() |
|---|
| 26 | { |
|---|
| 27 | case "$1" in |
|---|
| 28 | /*|./*) file="$1" ;; |
|---|
| 29 | *) file=$(type -path "$1") ;; |
|---|
| 30 | esac |
|---|
| 31 | |
|---|
| 32 | echo "*** line profile for $file ***" |
|---|
| 33 | i=1; |
|---|
| 34 | while read -r && [ $i -le $NLINE ]; do |
|---|
| 35 | count=${_line[$i]} |
|---|
| 36 | if [ "$count" -gt 0 ]; then |
|---|
| 37 | echo "[$count] $i: $REPLY" |
|---|
| 38 | fi |
|---|
| 39 | i=$((i + 1)) |
|---|
| 40 | done <$file |
|---|
| 41 | _EOF_ |
|---|
| 42 | # make the profiling script remove itself after printing line stats |
|---|
| 43 | echo "rm -f $TMPFILE" >> $TMPFILE |
|---|
| 44 | cat >> $TMPFILE <<- \_EOF_ |
|---|
| 45 | } |
|---|
| 46 | _command=$1 |
|---|
| 47 | shift |
|---|
| 48 | i=1 |
|---|
| 49 | NLINE=$(wc -l < "$_command") |
|---|
| 50 | while [ $i -le $NLINE ]; do |
|---|
| 51 | _line[$i]=0 |
|---|
| 52 | i=$((i + 1)) |
|---|
| 53 | done |
|---|
| 54 | unset i |
|---|
| 55 | trap "_profend ${_command}" EXIT |
|---|
| 56 | trap '_line[$LINENO]=$((${_line[$LINENO]} + 1))' DEBUG |
|---|
| 57 | LINENO=0 |
|---|
| 58 | _EOF_ |
|---|
| 59 | |
|---|
| 60 | case "$1" in |
|---|
| 61 | /*|./*) file=$1 ;; |
|---|
| 62 | *) file=$((type -path "$1")) ;; |
|---|
| 63 | esac |
|---|
| 64 | |
|---|
| 65 | cat "${file-$1}" >> $TMPFILE || errexit "${1}: cannot open" |
|---|
| 66 | chmod +x $TMPFILE |
|---|
| 67 | |
|---|
| 68 | exec -a "$file" $TMPFILE "$@" |
|---|