cal's unfortunate problem with argument handling
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.
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'
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
as it is to want a different month's calendar, and both of these
operations would like to lay claim to the single argument '
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
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.