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

21

Я получил ошибку:

bash: синтаксическая ошибка рядом с неожиданным токеном `; '

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

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

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

Спасибо.

DQdlM
источник

Ответы:

40

Вам не нужна точка с запятой. После отправки в фоновый режим можно получить другую команду.

evince foo.pdf bar.pdf & emacs foo.tex &
Тео
источник
2
Это помогло мне с заявлением, если после 2 часов ругательства. Если кому-то это понадобится:if [ $(ps -ef |grep -c '[p]grep') -eq 0 ]; then nohup sleep 5 > /dev/null 2>&1</dev/null & fi
Октав
13

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

";" и "&" - это терминаторы команд, что означает fg и bg соответственно. Так "; ;" (или «;» в начале строки) также недопустимо.

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

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

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

Паскаль и PERL имеют разделители, а не терминаторы.

Арканзас
источник
-3

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

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

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

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

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

Особенно, если вы затем захотите объединить больше команд после конца.

Majenko
источник
1
Нет необходимости порождать подоболочку, чтобы оправдать использование ненужной точки с запятой. Скобки - это не просто синтаксис; они приводят к дополнительной работе.
Чепнер