Почему ; после & вернул непредвиденную ошибку токена в bash?

Почему ; после & вернул непредвиденную ошибку токена в bash?

Я получил сообщение об ошибке:

bash: синтаксическая ошибка около неожиданного токена `;'

из-за следующей команды:

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

Я незаконно разделять команды с помощью ;при использовании &для фоновой работы? Или есть другая причина, по которой это не сработало?

Спасибо.

решение1

Точка с запятой не нужна. После того, как она отправлена ​​в фоновый режим, она свободна для получения другой команды.

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

решение2

Кстати, основная проблема в том, что оболочки (производные от Bourne) не допускают пустых команд.

";" и "&" являются терминаторами команд, означающими fg и bg соответственно. Поэтому "; ;" (или ";" в начале строки) также недопустимо.

(Новая строка(ы) подразумевает ";", если есть еще не завершенная команда, если только вы не используете "\" для продолжения строки.)

Языки этих политик сильно различаются:

Языки, производные от C, допускают пустые операторы.

В языках Pascal и PERL используются разделители, а не терминаторы.

решение3

Нет, просто запутался и не могу понять, что вы имеете в виду.

Вам необходимо сгруппировать & с командой, которую вы хотите перевести в фоновый режим:

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

Это работает отлично. Еще более явным было бы:

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

Особенно, если вы затем захотите связать еще несколько команд после окончания.

Связанный контент