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


21

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

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

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

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

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

Спасибо.

Ответы:


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 &)

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


1
Нет необходимости порождать подоболочку, чтобы оправдать использование ненужной точки с запятой. Скобки - это не просто синтаксис; они приводят к дополнительной работе.
Чепнер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.