less
executa o seguinte código quando não recebe nenhum argumento de nome de arquivo:
if (isatty(fd0))
{
error("Missing filename (\"less --help\" for help)", NULL_PARG);
quit(QUIT_OK);
}
return (edit("-"));
Está reclamando quando a entrada padrão é um terminal. Se a entrada padrão for um arquivo ou pipe comum, tudo bem com isso.
Ele presumivelmente faz isso porque precisa ler as respostas do terminal no final de cada página, e não há como distinguir os dados que estão sendo paginados e as respostas.
Isso não é mencionado na página man. Talvez devesse ser.
cat
não exibe sua saída e não lê as respostas do terminal. Não tem nenhuma restrição quanto ao stdin ser um terminal.