Perchè ; dopo e restituire un errore token imprevisto in bash?


21

Ho ricevuto l'errore:

bash: errore di sintassi vicino al token imprevisto `; '

a causa del seguente comando:

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

È illegale separare i comandi ;quando si usa &un lavoro in background? O c'è un altro motivo per cui non ha funzionato?

Grazie.

Risposte:


40

Non hai bisogno del punto e virgola. Dopo che è stato inviato in background è gratuito ottenere un altro comando.

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

2
Questo mi ha aiutato con un'istruzione if dopo 2 ore di imprecazioni. Se qualcuno dovesse averne bisogno:if [ $(ps -ef |grep -c '[p]grep') -eq 0 ]; then nohup sleep 5 > /dev/null 2>&1</dev/null & fi
Oktav,

13

A proposito, il problema principale è che le shell (derivate da Bourne) non consentono comandi vuoti.

";" e "&" sono terminatori di comando, che significano rispettivamente fg e bg. Così "; ;" (o ";" all'inizio di una riga) non è valido.

(Newline (s) implicano ";" se esiste un comando non ancora terminato, a meno che non si usi "\" per continuare la linea.)

Le lingue variano molto su queste politiche:

I linguaggi derivati ​​da C consentono istruzioni vuote.

Pascal e PERL hanno separatori, non terminatori.


-3

No, è solo confuso e non riesce a capire bene cosa intendi.

Devi raggruppare il & con il comando che vuoi mettere in background:

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

Funziona benissimo. Ancora più esplicito sarebbe:

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

Soprattutto se poi volevi incatenare più comandi anche dopo la fine.


1
Non è necessario generare una subshell solo per giustificare l'uso di un punto e virgola non necessario. Le parentesi non sono solo sintassi; causano un lavoro extra.
Chepner,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.