Neden oldu ; sonra & Bash beklenmedik bir belirteç hatası döndürür?


21

Hatayı aldım:

bash: beklenmeyen belirtecin yanında sözdizimi hatası `; '

aşağıdaki komut nedeniyle:

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

Bir işi arka planda ;kullanmak &için komutları ayırmak yasadışı mı? Yoksa bunun işe yaramamasının başka bir nedeni var mı?

Teşekkür ederim.

Yanıtlar:


40

Noktalı virgül gerekmez. Arka plana gönderildikten sonra başka bir komut almak ücretsizdir.

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

2
Bu bana küfür 2 saat sonra bir if ifadesi ile yardımcı oldu. Herkes buna ihtiyaç if [ $(ps -ef |grep -c '[p]grep') -eq 0 ]; then nohup sleep 5 > /dev/null 2>&1</dev/null & fi
duyarsa

13

BTW, asıl mesele (Bourne türevi) mermilerin boş komutlara izin vermemesidir.

";" ve "&", sırasıyla fg ve bg anlamına gelen komut sonlandırıcılardır. Yani "; ;" (veya satırın başındaki ";") de geçersizdir.

(Satır devam etmek için "\" kullanmadığınız sürece henüz sonlandırılmamış bir komut varsa, yeni satırlar ";" anlamına gelir.)

Diller, bu politikalarda çok değişiklik gösterir:

C'den türetilmiş diller boş ifadelere izin verir.

Pascal ve PERL'de sonlandırıcılar değil ayırıcılar vardır.


-3

Hayır, sadece kafası karıştı ve ne demek istediğini anlayamıyor.

Arka planı koymak istediğiniz & komutunu gruplandırmanız gerekir:

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

Güzel çalışıyor. Daha da açık olan:

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

Özellikle de sondan sonra daha fazla komut zincirlemek istediyseniz.


1
Sadece gereksiz bir noktalı virgül kullanımını haklı çıkarmak için bir alt kabuk oluşturmaya gerek yoktur. Parantezler sadece sözdizimi değildir; ekstra iş yapılmasına neden olurlar.
chepner
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.