How can I detect BSD vs. GNU version of date in shell script
You want to detect what version of the date
command you're using, not necessarily the OS version.
The GNU Coreutils date
command accepts the --version
option; other versions do not:
if date --version >/dev/null 2>&1 ; then echo Using GNU dateelse echo Not using GNU datefi
But as William Pursell suggests, if at all possible you should just use functionality common to both.
(I think the options available for GNU date are pretty much a superset of those available for the BSD version; if that's the case, then code that assumes the BSD version should work with the GNU version.)
Use portable flags. The standard is available here
For the particular problem of printing a relative date, it is probably easier to use perl than date:
perl -E 'say scalar localtime( time - 86400 )'
(note that this solution utterly fails on 23 or 25 hour days, but many perl solutions are available to address that problem. See the perl faq.)
but you could certainly use a variation of Keith's idea and do:
if date -v -1d > /dev/null 2>&1; then DATE='date -v 1d'else DATE='date --date="1 day ago"'fieval $DATE
or just
DATE=$(date -v -1d 2> /dev/null) || DATE=$(date --date="1 day ago")
Another idea is to define a function to use:
if date -v -1d > /dev/null 2>&1; then date1d() { date -v -1d; }else date1d() { date --date='1 day ago'; }fi