Pourquoi? après et renvoyer une erreur de jeton inattendue dans bash?

21

J'ai reçu l'erreur:

bash: erreur de syntaxe près du jeton inattendu `; '

en raison de la commande suivante:

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

Est-il illégal de séparer les commandes ;lors de l'utilisation &en arrière-plan d'un travail? Ou y a-t-il une autre raison pour laquelle cela n'a pas fonctionné?

Je vous remercie.

DQdlM
la source

Réponses:

40

Vous n'avez pas besoin du point-virgule. Une fois qu'il est envoyé en arrière-plan, il est gratuit d'obtenir une autre commande.

evince foo.pdf bar.pdf & emacs foo.tex &
Théo
la source
2
Cela m'a aidé avec une déclaration if après 2h de prestation de serment. Si quelqu'un en a besoin:if [ $(ps -ef |grep -c '[p]grep') -eq 0 ]; then nohup sleep 5 > /dev/null 2>&1</dev/null & fi
Oktav
13

BTW, le problème principal est que les shells (dérivés de Bourne) n'autorisent pas les commandes vides.

";" et "&" sont des terminateurs de commande, signifiant respectivement fg et bg. Donc "; ;" (ou ";" au début d'une ligne) n'est pas non plus valide.

(Les sauts de ligne impliquent ";" s'il existe une commande non encore terminée, sauf si vous utilisez "\" pour continuer la ligne.)

Les langues varient beaucoup sur ces politiques:

Les langages dérivés de C autorisent les instructions vides.

Pascal et PERL ont des séparateurs, pas des terminateurs.

AR
la source
-3

Non, c'est juste confus et ne peut pas comprendre ce que vous voulez dire.

Vous devez regrouper le & avec la commande que vous souhaitez mettre en arrière-plan:

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

Ça marche bien. Encore plus explicite serait:

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

Surtout si vous souhaitez également enchaîner plus de commandes après la fin.

Majenko
la source
1
Il n'est pas nécessaire de générer un sous-shell juste pour justifier l'utilisation d'un point-virgule inutile. Les parenthèses ne sont pas seulement de la syntaxe; ils entraînent un travail supplémentaire.
chepner