66 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			66 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
#! /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 "$@"
 |