jhalfs progress_bar

George Boudreau georgeb at linuxfromscratch.org
Wed Jun 7 18:24:30 PDT 2006


Manuel,
   I found a few < gotcha's > in the code I sent you. Most are caused by 
the lack of a synchronization between progress_bar and the makefile. 
<progress_bar.sh> is asynchronous and there is not much that can be done.
   The program wakes up, writes to the screen and then checks to see if 
should exit. This is a problem if the target build completes while the 
progress bar is asleep. The makefile outputs a trace for the next target 
build and the screen text becomes messy.
   I added some new traps and moved other completion traps around. The 
screen stays clean now. (except that 'scroll-lock' will stall the 
display and invalidate the counter)

   George

#!/bin/bash

set -e

# Be sure that we know the target name
[[ -z $1 ]] && exit

declare -r  CSI=$'\e['  # DEC terminology, Control Sequence Introducer
declare -r  CURSOR_OFF=${CSI}$'?25l'
declare -r  CURSOR_ON=${CSI}$'?25h'
declare -r  ERASE_LINE=${CSI}$'2K'
declare -r  FRAME_OPEN=${CSI}$'2G['
declare -r  FRAME_CLOSE=${CSI}$'63G]'
declare -r  TS_POSITION=${CSI}$'65G'    # Time Stamp
declare -a  GRAPHIC_STR="| / - \\ . "
declare -i  MIN=0  # Start value for minutes
declare -i  POS=0  # Start value for seconds/cursor position

# Initialize the display line.
echo -n "\
${CURSOR_OFF}\
${ERASE_LINE}\
${FRAME_OPEN}\
${FRAME_CLOSE}\
${TS_POSITION}${MIN} min. ${POS} sec."

# A failsafe, target may be built
if [ ! -f $1 ] ; then
     # While make is alive
   while fuser -v . 2>&1 | grep make >/dev/null ; do
       # A little animation at the current position
     for i in ${GRAPHIC_STR} ; do
         # If the target build is complete.. just leave
       [[ -f $1 ]] && echo -n "${CURSOR_ON}" && exit

       echo -ne "${CSI}$((${POS} +3))G$i"
       sleep .2

         # Don't miss default prompt if make fails while we were asleep
       if ! fuser -v . 2>&1 | grep make >/dev/null ; then
         echo -n "${CURSOR_ON}" && exit
       fi
     done
       # Be sure to exit cleanly
       # target may have completed while we were asleep
     [[ -f $1 ]] && break

       # Increment position and seconds counter
     ((POS++))
       # Minutes counter
     if [[ "$POS" = "60" ]] ; then
       POS=0
       ((MIN++))
       echo -n "${ERASE_LINE}${FRAME_OPEN}${FRAME_CLOSE}"
     fi
       # Display the accumulated time.
     echo -n "${TS_POSITION}${MIN} min. ${POS} sec."
   done
fi
echo -n "${CURSOR_ON}"



More information about the alfs-discuss mailing list