Por qué ; ¿Después y devolver un error de token inesperado en bash?

Por qué ; ¿Después y devolver un error de token inesperado en bash?

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 utilizan &como fondo de un trabajo? ¿O hay otra razón por la que esto no funcionó?

Gracias.

Respuesta1

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 &

Respuesta2

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

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

(Las nuevas líneas implican ";" si hay un comando que aún no ha 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.

Respuesta3

No, simplemente es confuso y no puede entender exactamente lo que quieres decir.

Debes agrupar el & con el comando que deseas 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 luego también quisieras encadenar más comandos después del final.

información relacionada