Mengapa ; setelah & mengembalikan kesalahan token yang tidak terduga di bash?

21

Saya menerima kesalahan:

bash: kesalahan sintaksis dekat token tak terduga `; '

karena perintah berikut:

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

Apakah ilegal memisahkan perintah dengan ;ketika menggunakan &latar belakang pekerjaan? Atau adakah alasan lain mengapa ini tidak berhasil?

Terima kasih.

DQdlM
sumber

Jawaban:

40

Anda tidak perlu titik koma. Setelah dikirim ke latar belakang, bebas untuk mendapatkan perintah lain.

evince foo.pdf bar.pdf & emacs foo.tex &
Theo
sumber
2
Ini membantu saya dengan pernyataan if setelah 2 jam bersumpah. Jika ada yang membutuhkan ini:if [ $(ps -ef |grep -c '[p]grep') -eq 0 ]; then nohup sleep 5 > /dev/null 2>&1</dev/null & fi
Oktav
13

BTW, masalah intinya adalah bahwa shell (diturunkan dari turunan) tidak mengijinkan perintah kosong.

";" dan "&" adalah terminator perintah, yang berarti masing-masing fg dan bg. Jadi ";;" (atau ";" di awal baris) juga tidak valid.

(Baris baru menyiratkan ";" jika ada perintah yang belum dihentikan, kecuali jika Anda menggunakan "\" untuk melanjutkan baris.)

Bahasa sangat bervariasi dalam kebijakan ini:

Bahasa turunan C memungkinkan pernyataan kosong.

Pascal dan PERL memiliki separator, bukan terminator.

AR
sumber
-3

Tidak, ini hanya membingungkan dan tidak bisa mengerti maksud Anda.

Anda perlu mengelompokkan & dengan perintah yang ingin Anda letakkan di latar belakang:

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

Itu bekerja dengan baik. Yang lebih eksplisit adalah:

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

Terutama jika Anda kemudian ingin rantai lebih banyak perintah setelah akhir juga.

Majenko
sumber
1
Tidak perlu menelurkan subkulit hanya untuk membenarkan penggunaan semi-kolon yang tidak perlu. Kurung bukan hanya sintaksis; mereka menyebabkan pekerjaan ekstra harus dilakukan.
chepner