รันคำสั่งเดียวกันหลาย ๆ ครั้งในพื้นหลัง


14

เป็นไปได้อย่างไรที่จะเรียกใช้หลายคำสั่งและใช้แบ็คกราวน์โดยใช้ bash?

ตัวอย่างเช่น:

$ for i in {1..10}; do wait file$i &; done

โดยที่ wait เป็นไบนารีที่กำหนดเอง

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

syntax error near unexpected token `;'

เมื่อรันคำสั่งด้านบน

เมื่อพื้นหลังคำสั่งควรทำงานในแบบคู่ขนาน


1
กำลังทำให้คุณไม่ได้อ้างถึง: nohupอนุญาตให้คุณรันคำสั่งในพื้นหลัง
Dave Hamilton

3
ข้อผิดพลาดที่คุณเห็นเกิดจาก&และ;เป็นทั้ง "ตัวยกเลิกคำสั่ง" คุณไม่จำเป็นต้องใช้ทั้งสองอย่าง: for ...; do wait $arg & doneจะได้ผล
เกล็นแจ็คแมน

@glenn jackman ใช่ฉันลองจริง ๆ หลังจากโพสต์คำถาม ไม่จำเป็นสำหรับทั้งคู่; และ &
Sebi

3
สำหรับผู้อ่านในอนาคตลิงก์ไปยังเอกสาร : "รายการคือลำดับของหนึ่งหรือมากกว่าหนึ่งท่อคั่นด้วยหนึ่งในผู้ประกอบการ ';', '&', '&', '& &' หรือ '| |' และเลือกโดยหนึ่งของ ';', '&' หรือขึ้นบรรทัดใหม่ " (เน้นที่เหมือง)
เกล็นแจ็คแมน

คำตอบ:


21

&เช่นเดียวกับ;เป็นรายการ Terminatorผู้ประกอบการ พวกเขามีไวยากรณ์เดียวกันและสามารถใช้แทนกันได้ (ขึ้นอยู่กับสิ่งที่คุณต้องการจะทำ) ซึ่งหมายความว่าคุณไม่ต้องการหรือความต้องการทั้งหมดที่คุณต้องการก็คือcommand1 &; command2command1 & command2

ดังนั้นในตัวอย่างของคุณคุณสามารถเขียน:

for i in {1..10}; do wait file$i & done

และแต่ละwaitคำสั่งจะเปิดตัวในพื้นหลังและวนรอบจะย้ายไปยังถัดไปทันที


4

เพื่อความเข้ากันได้ใช้รูปแบบ posix แทนการขยาย:

for i in $(seq 1 10); do (./wait file$i &); done

1
โปรดทราบว่าseqไม่ใช่คำสั่ง POSIX และโดยทั่วไปจะพบได้เฉพาะในระบบ GNU พฤติกรรมหรือ$(...)(และ$i) $IFSขึ้นอยู่กับมูลค่าปัจจุบันของ โปรดทราบด้วยว่าการทำเช่น(cmd &)นั้นcmdจะเป็นลูกของ subshell ดังนั้นคุณจะไม่สามารถรอและรับสถานะทางออกได้
Stéphane Chazelas

2

คุณสามารถจัดกลุ่มคำสั่งและวางคำสั่งที่จัดกลุ่มไว้ในพื้นหลัง ชอบ :

$ for i in {1..10}; do ((wait file$i)&); done

ไม่จำเป็นต้องใช้วงเล็บใน ...
marc

จำเป็นต้องใช้วงเล็บภายในเท่านั้นหากคุณต้องการใส่คำสั่งเบื้องหลังหลาย ๆ คำสั่งตามที่ถามในคำถาม กดไลค์ ((หลับ 1; รอไฟล์ $ i) &);
mazs

2

ไบนารีของคุณชื่อจริงwaitเหรอ? ฉันไม่แนะนำให้ทำเพราะwaitเป็นเชลล์ในตัว

ฉันเชื่อว่าทุบตีไม่แยกวงหนึ่งบรรทัดที่เปิดตัวกระบวนการพื้นหลัง ฉันแนะนำให้คุณเปลี่ยนรหัสเป็น:

$ for i in {1..10}; do ./wait file$i & echo "Running 'wait' using PID=$!..."; done
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.