Dlaczego zrobił ; po i zwrócić nieoczekiwany błąd tokena w bash?

21

Otrzymałem błąd:

bash: błąd składni w pobliżu nieoczekiwanego tokena `; '

z powodu następującego polecenia:

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

Czy rozdzielanie poleceń ;przy użyciu &do tła zadania jest nielegalne ? A może jest inny powód, dla którego to nie działało?

Dziękuję Ci.

DQdlM
źródło

Odpowiedzi:

40

Nie potrzebujesz średnika. Po wysłaniu do tła można uzyskać kolejne polecenie.

evince foo.pdf bar.pdf & emacs foo.tex &
Theo
źródło
2
Pomogło mi to w stwierdzeniu „if” po 2 godzinach przekleństw. Jeśli ktokolwiek powinien tego potrzebować:if [ $(ps -ef |grep -c '[p]grep') -eq 0 ]; then nohup sleep 5 > /dev/null 2>&1</dev/null & fi
Oktav,
13

BTW, podstawowy problem polega na tym, że (pochodne Bourne'a) powłoki nie pozwalają na puste polecenia.

„;” a „&” to terminatory poleceń, oznaczające odpowiednio fg i bg. Więc "; ;" (lub „;” na początku wiersza) jest również niepoprawny.

(Nowe wiersze oznaczają „;”, jeśli istnieje polecenie, które nie zostało jeszcze zakończone, chyba że użyjesz „\”, aby kontynuować linię.)

Języki różnią się znacznie w tych zasadach:

Języki pochodne C pozwalają na stosowanie pustych instrukcji.

Pascal i PERL mają separatory, a nie terminatory.

AR
źródło
-3

Nie, to jest po prostu zdezorientowane i nie może zrozumieć, co masz na myśli.

Musisz zgrupować & z poleceniem, które chcesz umieścić w tle:

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

To działa dobrze. Jeszcze bardziej wyraźne byłoby:

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

Zwłaszcza, jeśli po tym chcesz również połączyć więcej poleceń.

Majenko
źródło
1
Nie ma potrzeby odradzania podpowłoki, aby uzasadnić użycie niepotrzebnego średnika. Nawiasy to nie tylko składnia; powodują dodatkową pracę do wykonania.
chepner