: ########################################################################## # Title : watch - watch the directory listing of a file # Author : Heiner Steven # Date : 1995-11-04 # Category : File Utilities # Requires : # SCCS-Id. : @(#) watch 2.2 06/01/04 ########################################################################## # Description # ########################################################################## PN=`basename "$0"` # Program name VER='2.2' DEFAULT_TIME=300 # Max. time to wait (seconds) DEFAULT_INTERVAL=2 # Seconds to wait between "ls" usage () { echo >&2 "$PN - watch a directory entry, $VER usage: $PN [-s] [-t maxtime] [-i interval] {file|directory} [...] -s: silent, no output -t: maximum time (in seconds) to wait for a change (0=wait forever; default: $DEFAULT_TIME) -i: check interval (in seconds, default: $DEFAULT_INTERVAL)" exit 1 } msg () { echo >&2 "$PN:" "$@" } fatal () { msg "$@"; exit 1; } ########################################################################## # isinteger - return TRUE (0) if the string is a valid integer ########################################################################## isinteger () { case "$1" in *[!0-9]*) return 1;; esac return 0 } ########################################################################## # echon - "echo" without trailing newline character ########################################################################## echon () { if [ X"$ECHON" = X ] then ECHON=echo # Determine how to "echo" without newline: "echo -n" or "echo ...\c" if [ X`echo -n` = X-n ] then E_N=; NNL="\c" else E_N=-n; NNL= fi fi $ECHON $E_N "$*$NNL" } #set -- `getopt 'hi:st:' "$@"` || usage Silent=false while [ $# -gt 0 ] do case "$1" in -s) Silent=true;; -t) WaitPeriod=$2; shift isinteger "$WaitPeriod" || fatal "invalid number of seconds: $WaitPeriod" ;; -i) WaitInterval=$2; shift isinteger "$WaitInterval" || fatal "invalid number of seconds: $WaitInterval" ;; --) shift; break;; -h) usage;; -*) usage;; *) break;; # First file name esac shift done [ $# -lt 1 ] && usage waitperiod=${WaitPeriod:-$DEFAULT_TIME} waitinterval=${WaitInterval:=$DEFAULT_INTERVAL} [ "$waitinterval" -gt "$waitperiod" ] && waitinterval=$waitperiod timeleft=$waitperiod while [ "$timeleft" -ge 0 ] do line=`eval ls -ldgt "$@" 2>&1` if [ X"$line" != X"$lastline" ] then # File has changed [ "$Silent" = false ] && echo '|' "$line" lastline=$line timeleft=$waitperiod # Reset timer fi if [ "$waitperiod" -gt 0 ] then [ "$Silent" = false ] && echon >&2 "$timeleft " timeleft=`expr "$timeleft" - "$waitinterval"` fi sleep "$waitinterval" done exit 0