Isso é como printf
é especificado para se comportar :
The format operand shall be reused as often as necessary to satisfy the argument operands. Any extra b, c, or s conversion specifiers shall be evaluated as if a null string argument were supplied; other extra conversion specifications shall be evaluated as if a zero argument were supplied. If the format operand contains no conversion specifications and argument operands are present, the results are unspecified.
No seu caso, o formato %s
é repetido quantas vezes forem necessárias para lidar com todos os argumentos.
printf "%s" a b
e
printf "%s%s" a b
produz o mesmo resultado, porque no primeiro caso, %s
é repetido duas vezes, o que equivale a %s%s
.