#!/usr/bin/ksh93 ################################################################ function usagemsg_watch_k93 { print " Program: watch_k93 The watch_k93 Korn Shell command/function runs a user specified "command" repeatedly, displaying its output (the first screen full). This allows the user to watch the program output change over time. By default, the program is run every 2 seconds. Usage: ${1##*/} [-n SECONDS] [-i ITERATIONS] [-e ][-v] [-V] [-?] Where: '-n SECONDS' = Interval between running command (seconds) (default: 2 seconds) '-i ITERATIONS' = Number of iterations to run loop (default: continuous) '-e' = Display the end of the output from the command instead of the beginning '-v' = Verbose mode '-V' = Very Verbose Mode Author: Dana French (dfrench@mtxia.com) Copyright 2004 \"AutoContent\" enabled" return 0 } ################################################################ #### #### Description: #### #### The watch_k93 Korn Shell command/function runs a user #### specified "command" repeatedly, displaying its output #### (the first screen full). This allows the user to watch #### the program output change over time. By default, the #### program is run every 2 seconds. #### #### Assumptions: #### #### Dependencies: #### #### Products: #### #### Configured Usage: #### #### Details: #### ################################################################ function watch_k93 { typeset TRUE="0" typeset FALSE="1" typeset ENDOFOUT="${FALSE}" typeset VERBOSE="${FALSE}" typeset VERYVERB="${FALSE}" typeset INTERVAL="2" typeset ITERATIONS="-1" typeset SCRNLEN="24" typeset LINENBR="0" typeset -L79 HEADLINE typeset ITTEXT while getopts ":n#i#evV" OPTION do case "${OPTION}" in 'n') INTERVAL="${OPTARG}";; 'i') ITERATIONS="${OPTARG}";; 'e') ENDOFOUT="${TRUE}";; 'v') VERBOSE="${TRUE}";; 'V') VERYVERB="${TRUE}";; '?') usagemsg_watch_k93 "${0}" && return 1;; esac done shift $(( ${OPTIND} - 1 )) trap 'usagemsg_watch_k93 ${0}' EXIT (( INTERVAL < 0 )) && print -u 2 "ERROR: Invalid Interval" && exit 2 trap '-' EXIT (( VERYVERB == TRUE )) && set -x ################################################################ #### Initialize the iteration counter to zero, also the loop counter. #### If the number of iterations is less than zero, reset the iteration #### counter to be 1 less than the number of iterations ( for an #### endless loop ). CNT="0" LOOPCNT="0" (( ITERATIONS < 0 )) && (( CNT = ITERATIONS - 1 )) #### Execute the command specified by the user for the number of iterations #### specified. If the number of iterations was not specified the loop #### will continue endlessly until interrupted by the user. while (( CNT < ITERATIONS )) do #### Unset the array that contains the output from the command at every #### iteration so there are no leftovers from the previous iteration. #### Run the command with all specified parameters and options, and save #### the output to an array, one output line per array element. Count #### the number of lines in the output and save it to a variable. unset WATCHOUTPUT IFS=$'\n' WATCHOUTPUT=( $( "${@}" ) ) ARYEND="${#WATCHOUTPUT[*]}" clear (( LOOPCNT++ )) #### If the number of iterations was specified by the user, indicate #### that number on the screen header line. Otherwise just #### show the current iteration number. ITTEXT="Iteration ${LOOPCNT} of ${ITERATIONS}" (( ITERATIONS < 0 )) && ITTEXT="Iteration ${LOOPCNT}" HEADLINE="Every ${INTERVAL}s: ${ITTEXT}: ${@}: $( date )" print -r -- "${HEADLINE}" #### Determine the last array position of the output. If the number #### of output lines is less than the number of lines on the screen, #### set the last line to the number of lines in the output array, minus #### one line. (( ENDLINE = SCRNLEN - 2 )) (( ARYEND < SCRNLEN )) && (( ENDLINE = ARYEND - 1 )) BEGLINE=0 #### If the option to display the end of the output from the command was #### used, then set the beginning line to display equal to the last array #### position of the output, minus the length of the screen less one line. #### Then set the last line to the number of lines in the output array, #### minus one line. if (( ENDOFOUT == TRUE )) then (( BEGLINE = ARYEND - ( SCRNLEN - 1 ) )) (( BEGLINE < 0 )) && BEGLINE=0 (( ENDLINE = ARYEND - 1 )) fi #### Print one screenful of the the output from the command #### to the screen, except for the last line. for (( LINENBR=BEGLINE; LINENBR < ENDLINE; ++LINENBR )) do print -r -- "${WATCHOUTPUT[LINENBR]:0:79}" done #### Print the last line of output but not with a newline #### at the end. print -r -n -- "${WATCHOUTPUT[LINENBR]}" #### Increment the iteration counter. (( CNT++ )) #### If the number of iterations is less than zero, meaning #### to continuously output to the screen, then reset the iteration counter #### to one less than the number of iterations so the while loop will #### continue endlessly (( ITERATIONS < 0 )) && (( CNT = ITERATIONS - 1 )) #### If the iteration counter is not equal to the number of iterations #### allowed then sleep for the specified time period. If they are #### equal this means it is the last iteration, so don't sleep, just #### return to the calling function. (( CNT != ITERATIONS )) && sleep ${INTERVAL} done return 0 } ################################################################ watch_k93 "${@}"