summaryrefslogtreecommitdiff
path: root/examples/scripts.v2/shprof
diff options
context:
space:
mode:
Diffstat (limited to 'examples/scripts.v2/shprof')
-rw-r--r--examples/scripts.v2/shprof66
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 "$@"