#!/usr/bin/env sh # YES_ZSH # YES_BASH # YES_DASH # YES_ASH now() { ### @- ### print a date-time (UTC) in a sortable format. ### this takes a date or file as an argument, ### else it defaults to the current time. ### ``` ### $ now ### 2019-05-27_35083906 ### $ now ~/sh/monitor ### 2017-03-14_82387259 ### $ now '@1234567890' ### 2009-02-13_84690000 ### ``` [ $# -le 1 ] || { printf "%s\n" "$0: too many arguments" >&2; return 1; } local dt= fmt='+%F_%T_%N' if [ -z "$1" ]; then dt="$(date -u "$fmt")" elif [ -e "$1" ]; then dt="$(date -u -r "$1" "$fmt")" else dt="$(date -u -d "$1" "$fmt")" fi local F= T= N= F=${dt%%_*} T=${dt#*_} T=${T%_*} N=${dt##*_} local H= M= S= H=${T%%:*} M=${T#*:} M=${M%:*} S=${T##*:} # don't interpret numbers as octal F=${F#0*} T=${T#0*} N=${N#0*} H=${H#0*} M=${M#0*} S=${S#0*} local ms= ms=$(( (H*60*60+M*60+S)*1000+N/1000000 )) ms=$(printf '%08i' $ms) echo "${F}_${ms}" } [ -n "${preload+-}" ] || now "$@"