วิธีแบ็คกราวน์คำสั่ง?


15

cp a b && mv b c && rm aฉันต้องการที่จะพื้นหลังห่วงโซ่คำสั่งเช่น

ฉันได้ลองทำแล้วcp a b && mv b c && rm a &แต่นี่เป็นเพียงกระบวนการขั้นตอนสุดท้ายเท่านั้น

ฉันจะพื้นหลังห่วงโซ่คำสั่งได้อย่างไร

คำตอบ:


22

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; } &

8
ภายใต้การทุบตี , { ... ; } &ทำส้อมในระดับกระบวนการปัจจุบันในขณะที่( ... ) &ทำส้อมจาก subshell แล้ว ... ผลที่ได้คือเหมือนกัน แต่มีความแตกต่างที่ลึกซึ้งอยู่แล้ว
F. Hauri

14

คุณสามารถใส่มันเข้าไปใน parantheses (cp a b && mv b c && rm a )&เพื่อรวมห่วงโซ่ทั้งหมด


2
และที่สำคัญสิ่งนี้ทำให้เห็นได้ชัดว่าห่วงโซ่ทั้งหมดมีพื้นหลังแม้กระทั่งคนที่อาจไม่รู้กฎว่าผู้ประกอบการมีข้อ จำกัด อย่างไร
jackweirdy

2
ดูความคิดเห็นของฉันต่อคำตอบของ @ Gilles ฉันคิดว่า{ ... ; }เป็นรูปแบบที่สามารถทำได้ล่วงหน้า (วิธี)
F. Hauri
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.