
Ich habe den folgenden Fehler erhalten:
bash: Syntaxfehler in der Nähe des unerwarteten Tokens „;“
aufgrund des folgenden Befehls:
evince foo.pdf bar.pdf &; emacs foo.tex &
Ist es unzulässig, Befehle mit zu trennen, ;
wenn &
ein Job im Hintergrund verwendet wird? Oder gibt es einen anderen Grund, warum dies nicht funktioniert hat?
Danke schön.
Antwort1
Sie brauchen das Semikolon nicht. Nachdem es in den Hintergrund gesendet wurde, ist es frei, einen anderen Befehl abzurufen.
evince foo.pdf bar.pdf & emacs foo.tex &
Antwort2
Übrigens besteht das Kernproblem darin, dass (von Bourne abgeleitete) Shells keine leeren Befehle zulassen.
";" und "&" sind Befehlsabschlusszeichen und bedeuten fg bzw. bg. Daher ist "; ;" (oder ";" am Anfang einer Zeile) ebenfalls ungültig.
(Neue Zeilen implizieren ";", wenn ein noch nicht beendeter Befehl vorliegt, es sei denn, Sie verwenden "\", um die Zeile fortzusetzen.)
Die Sprachen dieser Richtlinien variieren stark:
Von C abgeleitete Sprachen erlauben leere Anweisungen.
Pascal und PERL haben Trennzeichen, keine Terminatoren.
Antwort3
Nein, ich bin einfach verwirrt und kann nicht ganz nachvollziehen, was Sie meinen.
Sie müssen das & mit dem Befehl gruppieren, den Sie in den Hintergrund stellen möchten:
$ (evince foo.pdf bar.pdf &); emacs foo.tex &
Das funktioniert gut. Noch deutlicher wäre:
$ (evince foo.pdf bar.pdf &); (emacs foo.tex &)
Insbesondere dann, wenn man nach dem Ende noch weitere Befehle aneinanderreihen möchte.