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

21

Eu recebi o erro:

bash: erro de sintaxe próximo ao token inesperado `; '

devido ao seguinte comando:

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

É ilegal separar comandos ;ao usar &um plano de fundo para um trabalho? Ou há outro motivo para isso não funcionar?

Obrigado.

DQdlM
fonte

Respostas:

40

Você não precisa do ponto e vírgula. Depois de enviado para o plano de fundo, é livre obter outro comando.

evince foo.pdf bar.pdf & emacs foo.tex &
Theo
fonte
2
Isso me ajudou com uma declaração if após 2h de palavrões. Se alguém precisar disso:if [ $(ps -ef |grep -c '[p]grep') -eq 0 ]; then nohup sleep 5 > /dev/null 2>&1</dev/null & fi
Oktav 15/10
13

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

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

(As novas linhas implicam ";" se houver um comando ainda não finalizado, a menos que você use "\" para continuar a linha.)

Os idiomas variam muito nessas políticas:

Linguagens derivadas de C permitem declarações vazias.

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

AR
fonte
-3

Não, é apenas confuso e não consegue entender exatamente o que você quer dizer.

Você precisa agrupar o & com o comando que 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ê também quisesse encadear mais comandos após o final.

Majenko
fonte
11
Não é necessário gerar um subshell apenas para justificar o uso de um ponto e vírgula desnecessário. Parênteses não são apenas sintaxe; eles causam trabalho extra a ser feito.
chepner