shprof   [plain text]


#! /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 "$@"