Warum? nach & einen unerwarteten Token-Fehler in Bash zurückgeben?

21

Ich habe den Fehler erhalten:

Bash: Syntaxfehler in der Nähe von unerwartetem Token ";"

aufgrund des folgenden Befehls:

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

Ist es illegal, Befehle mit zu trennen, ;wenn &ein Job im Hintergrund ausgeführt wird? Oder gibt es einen anderen Grund, warum dies nicht funktioniert hat?

Vielen Dank.

DQdlM
quelle

Antworten:

40

Sie brauchen kein Semikolon. Nachdem es in den Hintergrund gesendet wurde, können Sie einen weiteren Befehl abrufen.

evince foo.pdf bar.pdf & emacs foo.tex &
Theo
quelle
2
Dies half mir bei einer if-Anweisung nach 2 Stunden Fluchen. Wenn jemand dies brauchen sollte:if [ $(ps -ef |grep -c '[p]grep') -eq 0 ]; then nohup sleep 5 > /dev/null 2>&1</dev/null & fi
Oktav
13

Übrigens ist das Kernproblem, dass (von Borowski abgeleitete) Shells keine leeren Befehle zulassen.

";" und "&" sind Befehlsabschlüsse, die fg bzw. bg bedeuten. So "; ;" (oder ";" am Anfang einer Zeile) ist ebenfalls ungültig.

(Newline (s) implizieren ";", wenn es einen noch nicht abgeschlossenen Befehl gibt, es sei denn, Sie setzen die Zeile mit "\" fort.)

Die Sprachen variieren stark in Bezug auf diese Richtlinien:

C-abgeleitete Sprachen erlauben leere Anweisungen.

Pascal und PERL haben Trennzeichen, keine Abschlusszeichen.

AR
quelle
-3

Nein, es ist nur verwirrt und kann nicht genau sagen, 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 expliziter wäre:

$ (evince foo.pdf bar.pdf &); (emacs foo.tex &)

Vor allem, wenn Sie dann auch nach dem Ende weitere Befehle verketten wollten.

Majenko
quelle
1
Es ist nicht erforderlich, eine Subshell zu erzeugen, um die Verwendung eines unnötigen Semikolons zu rechtfertigen. Klammern sind nicht nur Syntax; Sie verursachen zusätzliche Arbeit.
Chepner