Чому ; після & повернення несподіваної помилки маркера в bash?


21

Я отримав помилку:

bash: помилка синтаксису біля несподіваного маркера `; '

завдяки наступній команді:

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

I чи заборонено відокремлювати команди, ;коли ви використовуєте &фон для роботи? Або є інша причина, що це не спрацювало?

Дякую.

Відповіді:


40

Точка з комою вам не потрібна. Після відправки на задній план ви можете отримати ще одну команду.

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

2
Це допомогло мені з заявою if після 2-х годин присяги. Якщо комусь це знадобиться:if [ $(ps -ef |grep -c '[p]grep') -eq 0 ]; then nohup sleep 5 > /dev/null 2>&1</dev/null & fi
Октав

13

До речі, основна проблема полягає в тому, що оболонки (похідні Борна) не дозволяють пусті команди.

";" і "&" - командні термінатори, що означають відповідно fg і bg. Так "; ;" (або ";" на початку рядка) також є недійсним.

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

Мови залежать від цих політик:

Мови, похідні з С, дозволяють пусті заяви.

Паскаль і 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.