In der Unix Shell ist generell alles so weil es halt so ist. Die Shell basiert nicht unbedingt viel auf Logik. Die meisten Erklaerungen und Konzepte sind nachtraeglich darueber gelegt worden, so auch die EBNF-Grammatik in POSIX:
https://pubs.opengroup.org/onlinepubs/9 ... #tag_18_10
Hier die relevanten Abschnitte aus der Grammatik-Definition.
Hier warum leere Zeilen erlaubt sind:
Code: Alles auswählen
program : linebreak complete_commands linebreak
| linebreak
;
complete_commands: complete_commands newline_list complete_command
| complete_command
;
newline_list : NEWLINE
| newline_list NEWLINE
;
Und hier wie es sich mit & und ; verhaelt:
Code: Alles auswählen
complete_command : list separator_op
| list
;
list : list separator_op and_or
| and_or
;
separator_op : '&'
| ';'
;
Zwei separator_op hintereinander gehen nicht.
Das erklaert warum die Shell sich so verhaelt (sie verhaelt sich kompatibel zur Bourne-Shell und zu POSIX), aber es erklaert nicht was der Grund ist, warum sie sich so verhaelt (weil das der Willkuer von Ken Thompson, Steven Bourne, David Korn und weiteren geschuldet ist).
Edit: JTH war schneller.