function logeasy { typeset path dir base device logdir logname keep pid abba silent eval path= keep=30 device=file silent=no "$@" [[ $device = stdout ]] && return 0 [[ $device = null ]] && { exec >/dev/null 2>&1; return 0; } base=${path##*/} base=${base%.@(ksh|sh|s|ss)} [[ -z "$logdir" ]] && { if [[ $path = */* ]] then dir=${path%/*} else dir="." fi logdir=$dir/log } logdir=$logdir/$base [[ -d $logdir ]] || mkdir -p $logdir logdir=$(cd $logdir >/dev/null 2>&1 && pwd -P) while [[ -z $logname || -f $logname ]] do [[ -z $logname ]] || sleep 1 logname=$logdir/$base.log.$(date +%Y-%m-%dT%H:%M:%S) done touch $logname [[ $device = "both" ]] && { tail -f $logname & pid=$! abba=$(function t { trap 'printf "%s" a' EXIT; }; t; printf "%s" b) t=/tmp/$$.$RANDOM trap -p > $t if [[ -s $t ]] then has_trap="Y" else has_trap="N" fi rm $t if [[ ${has_trap} = "Y" ]] then t=/tmp/$$.$RANDOM trapadd "exec >&-; exec 2>&-; sleep 3; kill $pid" EXIT append trapout > $t new_trap=$(< $t) rm $t if [[ $abba = "ab" ]] then trap "eval \"${new_trap}\"" EXIT else eval "${new_trap}" fi else if [[ $abba = "ab" ]] then trap "trapadd \"exec >&-; exec 2>&-; sleep 3; kill $pid\" EXIT" EXIT else trap "exec >&-; exec 2>&-; sleep 3; kill $pid" EXIT fi fi } [[ $silent = "yes" ]] || printf "%s\n" "Please check the logfile: $logname" exec >>$logname 2>&1 find $logdir -type f -mtime +$keep -exec rm {} \; }