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.

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 &

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.


-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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.