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.

Odpowiedzi:


40

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

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

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.


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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.