cp a b && mv b c && rm a
ฉันต้องการที่จะพื้นหลังห่วงโซ่คำสั่งเช่น
ฉันได้ลองทำแล้วcp a b && mv b c && rm a &
แต่นี่เป็นเพียงกระบวนการขั้นตอนสุดท้ายเท่านั้น
ฉันจะพื้นหลังห่วงโซ่คำสั่งได้อย่างไร
cp a b && mv b c && rm a
ฉันต้องการที่จะพื้นหลังห่วงโซ่คำสั่งเช่น
ฉันได้ลองทำแล้วcp a b && mv b c && rm a &
แต่นี่เป็นเพียงกระบวนการขั้นตอนสุดท้ายเท่านั้น
ฉันจะพื้นหลังห่วงโซ่คำสั่งได้อย่างไร
คำตอบ:
cp a b && mv b c && rm a &
ถูกต้อง. มีความสำคัญต่ำกว่า&
&&
ในความเป็นจริง&
มีความสำคัญต่ำกว่าสิ่งอื่นนอกเหนือจาก;
และขึ้นบรรทัดใหม่: &
อยู่ในหมวดหมู่ไวยากรณ์เดียวกันกับ;
ความแตกต่างที่;
เรียกใช้รายการคำสั่งในเบื้องหน้าในขณะที่&
ทำงานในพื้นหลัง คุณสามารถทดสอบสิ่งนี้ได้ด้วยตัวเอง:
$ dash -c 'sleep 2 && echo waited & echo backgrounded'
backgrounded
$ waited
เหมือนกับ pdksh, ksh93, bash, csh, tcsh
ข้อยกเว้นคือ zsh ซึ่งเข้ากันไม่ได้อย่างประหลาด เอกสารนี้มีไว้ในคู่มือ :
หากมีรายการย่อยจะถูกยกเลิกโดย
&
,&|
หรือ&!
เปลือกดำเนินการที่ผ่านมาในท่อในพื้นหลังและไม่รอให้เสร็จสิ้น (โปรดสังเกตความแตกต่างจากหอยอื่น ๆ ซึ่งดำเนินรายการย่อยทั้งในพื้นหลัง)
น่าเสียดายที่ zsh ทำงานในลักษณะนี้แม้ในโหมดที่เข้ากันได้กับ sh หรือ ksh เพื่อให้แน่ใจว่าคำสั่งทั้งหมดจะถูกดำเนินการในพื้นหลังให้ใส่เครื่องหมายวงเล็บหรือวงเล็บล้อมรอบ วงเล็บสร้าง subshell ในขณะที่เครื่องหมายวงเล็บไม่ได้ แต่สิ่งนี้ไม่เกี่ยวข้อง (ยกเว้นเป็นการปรับให้เหมาะสมขนาดเล็กในเชลล์บางตัว) เนื่องจากคำสั่ง backgrounded อยู่ใน subshell ต่อไป
{ cp a b && mv b c && rm a; } &
คุณสามารถใส่มันเข้าไปใน parantheses (cp a b && mv b c && rm a )&
เพื่อรวมห่วงโซ่ทั้งหมด
{ ... ; }
เป็นรูปแบบที่สามารถทำได้ล่วงหน้า (วิธี)
{ ... ; } &
ทำส้อมในระดับกระบวนการปัจจุบันในขณะที่( ... ) &
ทำส้อมจาก subshell แล้ว ... ผลที่ได้คือเหมือนกัน แต่มีความแตกต่างที่ลึกซึ้งอยู่แล้ว