chown initially couldn't set the group. Later, some implementations added it as
chown user.group, some as
chown user:group until it was eventually standardised (emphasis mine):
The 4.3 BSD method of specifying both owner and group was included in
this volume of POSIX.1-2008 because:
There are cases where the desired end condition could not be achieved
using the chgrp and chown (that only changed the user ID) utilities.
(If the current owner is not a member of the desired group and the
desired owner is not a member of the current group, the chown()
function could fail unless both owner and group are changed at the
Even if they could be changed independently, in cases where both are
being changed, there is a 100% performance penalty caused by being
forced to invoke both utilities.
chown :group to only change the group is not portable or standard.
chown user: (to assign the primary group of the
user in the user database) is not standard either.