&2 exit 1 } Msg () { for i do echo "$PN: $i" >&2 done } Fatal () { Msg "$@"; exit 1; } LongOutput=no Header=yes while [ $# -gt 0 ] do case "$1" in -l) LongOutput=yes;; -h) Header=no;; --) shift; break;; -*) Usage;; *) break;; # First file name esac shift done [ $# -gt 0 ] && User="$1" if [ "$LongOutput" = no ] then [ $Header = yes ] && { date uname -n } # Sample output of who: # heiner console Apr 26 08:18 who | while read Name Tty Mon Day Time Host Rest do [ -n "$User" -a "$User" != "$Name" ] && continue echo " $Tty $Name $Time" case "$Tty" in *t"> &2 exit 1 } Msg () { for i do echo "$PN: $i" >&2 done } Fatal () { Msg "$@"; exit 1; } LongOutput=no Header=yes while [ $# -gt 0 ] do case "$1" in -l) LongOutput=yes;; -h) Header=no;; --) shift; break;; -*) Usage;; *) break;; # First file name esac shift done [ $# -gt 0 ] && User="$1" if [ "$LongOutput" = no ] then [ $Header = yes ] && { date uname -n } # Sample output of who: # heiner console Apr 26 08:18 who | while read Name Tty Mon Day Time Host Rest do [ -n "$User" -a "$User" != "$Name" ] && continue echo " $Tty $Name $Time" case "$Tty" in *t"> &2 exit 1 } Msg () { for i do echo "$PN: $i" >&2 done } Fatal () { Msg "$@"; exit 1; } LongOutput=no Header=yes while [ $# -gt 0 ] do case "$1" in -l) LongOutput=yes;; -h) Header=no;; --) shift; break;; -*) Usage;; *) break;; # First file name esac shift done [ $# -gt 0 ] && User="$1" if [ "$LongOutput" = no ] then [ $Header = yes ] && { date uname -n } # Sample output of who: # heiner console Apr 26 08:18 who | while read Name Tty Mon Day Time Host Rest do [ -n "$User" -a "$User" != "$Name" ] && continue echo " $Tty $Name $Time" case "$Tty" in *t">

PN=`basename "$0"`            # Program name 
VER=`echo '$Revision: 1.2 $' | cut -d' ' -f2` 

Usage () { 
    echo "$PN - who is doing what, $VER (stv '95) 
usage: $PN [-l] [-h] [user] 
    -h: suppress the heading 
    -l:    long form of output" >&2 
    exit 1 
} 

Msg () { 
    for i 
    do echo "$PN: $i" >&2 
    done 
} 

Fatal () { Msg "$@"; exit 1; } 

LongOutput=no 
Header=yes 
while [ $# -gt 0 ] 
do 
    case "$1" in 
    -l)    LongOutput=yes;; 
    -h)    Header=no;; 
    --)    shift; break;; 
    -*)    Usage;; 
    *)    break;;            # First file name 
    esac 
    shift 
done 

[ $# -gt 0 ] && User="$1" 

if [ "$LongOutput" = no ] 
then 
    [ $Header = yes ] && { 
    date 
    uname -n 
    } 

    # Sample output of who: 
    #    heiner   console Apr 26 08:18 
    who | 
    while read Name Tty Mon Day Time Host Rest 
    do 
        [ -n "$User" -a "$User" != "$Name" ] && continue 
        echo " 
$Tty    $Name    $Time" 
        case "$Tty" in 
        *tty*)    T=`echo "$Tty" | sed -e 's:.*tty(..).*:1:'`;; 
        *)    T=`echo "$Tty" | sed -e 's:/dev/(..).*:1:'`;; 
        esac 

        # Sample output of ps -c: 
        #    PID TT STAT  TIME COMMAND 
        #    327 p2 IW    0:19 ksh 
        ps -ct"$T" | tail +2 | 
        while read pid tty stat time command 
        do 
            echo "    $Tty    $pid    $time    $command" 
        done 
    done 
else 
    # Long form: use "w" output format 
    if [ $Header = yes ] 
    then FirstLine=1 
    else FirstLine=3 
    fi 
    if [ -z "$User" ] 
    then 
    w 
    else 
    w | grep "$User" 
    fi | tail +$FirstLine 
fi