Why did ; after & return an unexpected token error in bash?

Solution 1:

You don't need the semicolon. After it's sent to the background it's free to get another command.

evince foo.pdf bar.pdf & emacs foo.tex &

Solution 2:

BTW, the core issue is that (Bourne-derived) shells do not allow empty commands.

";" and "&" are command terminators, meaning fg and bg respectively. So "; ;" (or ";" at the beginning of a line) is also invalid.

(Newline(s) imply ";" if there is a not-yet-terminated command, unless you use "\" to continue the line.)

Languages vary a lot on these policies:

C-derived languages allow empty statements.

Pascal and PERL have separators, not terminators.