Every so often I want to see a calendar just to know things like what day of the week a future date will be (or vice versa). As an old Unix person, my tool for this is
cal
. Cal is generally a useful program, but it has one unfortunate usage quirk that arguably shows a general issue with Unix style argument handling.
By default,
cal
just shows you the current month. Suppose that you are using
cal
at the end of June, and you decide that you want to see July's calendar. So you absently do the obvious thing and run '
cal 7
' (because
cal
loves its months in decimal form). This does not do what you want; instead of seeing the month calendar for July of this year, you see the nominal full year calendar for AD 7. To see July, you need to do something like '
cal 7 2016
' or '
cal -m 7
'.
On the one hand, this is regrettably user hostile. '
cal N
' for N in the range of 1 to 12 is far more likely to be someone wanting to see the given month for the current year than it is to be someone who wants to see the year calendar for AD N. On the other hand, it's hard to get out of this without resorting to ugly heuristics. It's probably equally common to want a full year calendar from
cal
as it is to want a different month's calendar, and both of these operations would like to lay claim to the single argument '
cal N
' invocation because that's the most convenient way to do it.
If we were creating
cal
from scratch, one reasonably decent option would be to declare that all uses of
cal
without switches to explicitly tell it what you wanted were subject to heuristics. Then
cal
would have a license to make '
cal 7
' mean July of this year instead of AD 7, and maybe '
cal 78
' mean '
cal 1978
' ( cf the note in the V7
cal
manpage ). If you really wanted AD 7's year calendar, you'd give
cal
a switch to disambiguate the situation; in the mean time, you'd have no grounds for complaint. But however nice it might be, this would probably strike people as non-Unixy. Unix commands traditionally have predictable argument handling, even if it's not friendly, because that's what Unix considers more important (and also easier, if we're being honest).
In a related issue, I have now actually read the manpages for modern versions of
cal
(FreeBSD and Linux use different implementations) and boy has it grown a lot of options by now (options that will probably make my life easier if I can remember them and remember to use them). Reassuringly, the OmniOS version of
cal
still takes no switches; it's retained the V7 '
cal [[month] year]
' usage over all of these years.