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 "$@"
|