Por que; depois e retornar um erro de token inesperado no bash?

18

Recebi o erro:

bash: syntax error near unexpected token ';'

devido ao seguinte comando:

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

É ilegal separar comandos com ; ao usar & para executar um trabalho em segundo plano? Ou há outra razão pela qual isso não funcionou?

Obrigado.

    
por KennyPeanuts 11.04.2011 / 16:12

3 respostas

35

Você não precisa do ponto-e-vírgula. Depois que ele é enviado para o plano de fundo, é grátis ter outro comando.

evince foo.pdf bar.pdf & emacs foo.tex &
    
por 11.04.2011 / 16:23
12

BTW, a questão principal é que shells (derivados de Bourne) não permitem comandos vazios.

";" e "&" são terminadores de comando, significando fg e bg respectivamente. Assim "; ;" (ou ";" no início de uma linha) também é inválido.

(Nova linha (s) implica ";" se houver um comando ainda não terminado, a menos que você use "\" para continuar a linha.

Os idiomas variam muito nessas políticas:

As linguagens derivadas de C permitem instruções vazias.

Pascal e PERL têm separadores, não terminadores.

    
por 08.06.2012 / 16:50
-3

Não, é apenas confuso e não funciona bem o que você quer dizer.

Você precisa agrupar o & com o comando que você deseja colocar em segundo plano:

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

Isso funciona bem. Ainda mais explícito seria:

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

Especialmente se você quiser encadear mais comandos depois do fim também.

    
por 11.04.2011 / 16:20

Tags