ทำไมทำ; หลังจาก & ส่งคืนข้อผิดพลาดโทเค็นที่ไม่คาดคิดใน bash หรือไม่


21

ฉันได้รับข้อผิดพลาด:

bash: ข้อผิดพลาดทางไวยากรณ์ใกล้กับโทเค็นที่ไม่คาดคิด `; '

เนื่องจากคำสั่งต่อไปนี้:

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

ฉันผิดกฎหมายหรือไม่ที่จะแยกคำสั่งต่าง ๆ ด้วย;เมื่อใช้&แบ็คกราวน์งาน? หรือมีเหตุผลอื่นที่ไม่ได้ผล?

ขอขอบคุณ.

คำตอบ:


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
Oktav

13

BTW ปัญหาหลักคือเชลล์ (ที่ได้รับมาจากบอร์น) ไม่อนุญาตคำสั่งที่ว่างเปล่า

";" และ "&" ​​เป็นตัวยกเลิกคำสั่งหมายถึง fg และ bg ตามลำดับ ดังนั้น ";;" (หรือ ";" ที่จุดเริ่มต้นของบรรทัด) ก็ไม่ถูกต้องเช่นกัน

(ขึ้นบรรทัดใหม่บอกเป็นนัย ";" หากมีคำสั่งที่ยังไม่สิ้นสุดเว้นแต่คุณจะใช้ "\" เพื่อดำเนินการต่อบรรทัด)

ภาษามีความแตกต่างกันมากในนโยบายเหล่านี้:

ภาษาที่ได้จากภาษา C อนุญาตข้อความสั่งที่ว่างเปล่า

Pascal และ PERL มีตัวคั่นไม่ใช่ตัวคั่น


-3

ไม่มันสับสนและไม่สามารถพูดออกมาได้อย่างที่คุณต้องการ

คุณต้องจัดกลุ่มคำสั่ง & ด้วยคำสั่งที่คุณต้องการใส่ไว้ในพื้นหลัง:

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

มันใช้งานได้ดี ชัดเจนยิ่งขึ้นจะเป็น:

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

โดยเฉพาะถ้าคุณต้องการเชื่อมโยงคำสั่งเพิ่มเติมหลังจากสิ้นสุดเช่นกัน


1
ไม่จำเป็นต้องวางไข่ subshell เพียงเพื่อแสดงให้เห็นถึงการใช้เซมิโคลอนที่ไม่จำเป็น เครื่องหมายวงเล็บไม่ใช่แค่ไวยากรณ์เท่านั้น พวกเขาทำให้งานพิเศษที่ต้องทำ
chepner
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.