Source-Changes-D archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: CVS commit: othersrc/usr.bin/sleepto



    Date:        Fri, 26 Feb 2021 16:42:37 +1100
    From:        Simon Burge <simonb%NetBSD.org@localhost>
    Message-ID:  <20210226054237.6B07D4E23A%thoreau.thistledown.com.au@localhost>

  | Thinking about adding this to our existing sleep(1), so anything
  | in existing libraries that makes this (much!) easier is welcome.

I use the following sh function as my sleep command, it does what
I need, and the advantage of being a function, rather than compiled
code, is that it is trivial to change if what it does isn't quite what
someone else needs.   It uses "date -d" (and so, parsedate(3)) for its
input parsing, and can be used as a conventional sleep command (simply
exec's sleep) or as "sleep until sometime+date+offset" where the latter
is whatever parsedate allows (as 1 or more args to the function).

kre

sleep()
{
	case "$1" in
	until)	;;
	*)	command sleep "$@"; return;;
	esac

	shift
	case "$#" in
	0)	printf >&2 '%s\n' "Usage: sleep until date+time"; return 1;;
	esac

	local NOW=$(date +%s)
	local THEN; THEN=$(date -d "$*" +%s) || return 1
	local DELAY=$(( THEN - NOW ))
	case ${DELAY} in
	-*)	local HN=$(date -r "${NOW}" +%H)
		local HT=$(date -r "${THEN}" +%H)
		if [ "${HN#0}" -ge 14 ] && [ "${HT#0}" -le 6 ]
		then
			THEN=$(date -d "$* tomorrow" +%s) || return 1
			DELAY=$(( THEN - NOW ))
		fi
	esac
	case ${DELAY} in
	-*)	printf >&2 '%s\n' "In the past: $*"; return 1;;
	0)	return 0;;
	*)	command sleep "${DELAY}";;
	esac
}




Home | Main Index | Thread Index | Old Index