Por qué ; después y devuelve un error de token inesperado en bash?

21

Recibí el error:

bash: error de sintaxis cerca del token inesperado `; '

debido al siguiente comando:

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

¿Es ilegal separar comandos ;cuando se usa &para hacer un fondo de un trabajo? ¿O hay otra razón por la que esto no funcionó?

Gracias.

DQdlM
fuente

Respuestas:

40

No necesitas el punto y coma. Después de enviarlo a segundo plano, es gratis obtener otro comando.

evince foo.pdf bar.pdf & emacs foo.tex &
Theo
fuente
2
Esto me ayudó con una declaración if después de 2h de jurar. Si alguien necesita esto:if [ $(ps -ef |grep -c '[p]grep') -eq 0 ]; then nohup sleep 5 > /dev/null 2>&1</dev/null & fi
Oktav
13

Por cierto, el problema central es que los shells (derivados de Bourne) no permiten comandos vacíos.

";" y "&" son terminadores de comando, lo que significa fg y bg respectivamente. Entonces "; ;" (o ";" al comienzo de una línea) tampoco es válido.

(Newline (s) implica ";" si hay un comando aún no terminado, a menos que use "\" para continuar la línea).

Los idiomas varían mucho en estas políticas:

Los lenguajes derivados de C permiten declaraciones vacías.

Pascal y PERL tienen separadores, no terminadores.

Arkansas
fuente
-3

No, solo está confundido y no puede entender exactamente lo que quieres decir.

Debe agrupar el & con el comando que desea poner en segundo plano:

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

Eso funciona bien Aún más explícito sería:

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

Especialmente si también querías encadenar más comandos después del final.

Majenko
fuente
1
No es necesario generar una subshell solo para justificar el uso de un punto y coma innecesario. Los paréntesis no son solo sintaxis; causan trabajo extra por hacer.
chepner