ดำเนินการกระบวนการที่ถูกหยุดชั่วคราวต่อในลูป


13

ฉันกำลังวิ่งอยู่ในทุบตี:

for i in ull-*.pbm; do convert $i tmp2/$i.pdf ; done

ฉันCtrl-Zอยู่ในระหว่างการทำงานและจากนั้นfgid งานของมัน แต่การวนซ้ำที่เหลือยังไม่เสร็จสิ้น ฉันสงสัยว่าทำไม?


2
ฉันสามารถยืนยันได้ว่าสำหรับfor i in *.txt; do echo "$i"; sleep 0.5 ; done(GNU bash, รุ่น 4.2.53)
— Hauke ​​Laging

คำตอบ:


11

Ctrl-Zหยุดกระบวนการที่กำลังทำงานอยู่ชั่วคราว ในการแสดงออก

for i in ull-*.pbm; do convert "$i" "tmp2/$i.pdf" ; done

คำสั่งทั้งหมดยกเว้นconvert(เช่นfor, in, doและdone) เป็นbash's คำหลักที่ทำงานอยู่ในเปลือกปัจจุบันและเปลือกไม่สามารถระงับตัวเอง (และมันไม่ได้เป็นความตั้งใจของคุณ แต่อย่างใด) ดังนั้นเมื่อคุณกดCtrl-Zและคำสั่งconvertหยุดการทำงานชั่วคราวลูปก็จะออกจากการทำงานเนื่องจากไม่มีอะไรที่ต้องดำเนินการอีกต่อไป

หากคุณต้องการที่จะระงับทั้งวงแล้วเพียงแค่เรียกใช้ในสภาพแวดล้อม subshell:

(for i in ull-*.pbm; do convert "$i" "tmp2/$i.pdf" ; done)

เชลล์เดียวที่ฉันรู้ว่าสามารถหยุดการวนรอบทั้งหมดในเชลล์ปัจจุบันzshได้


4
ไม่, Ctrl-Zสามารถหยุดอินสแตนซ์ของการแปลงเพียงอันเดียวได้, ไม่มีเหตุผลที่ลูปไม่สามารถดำเนินการต่อและเริ่มต้นใหม่ได้ ด้วยเหตุผลบางอย่างbashหยุดการวนซ้ำ เมื่อฉันทดสอบในdashลูปต่อไปเชลล์อื่นอาจทำเช่นเดียวกัน
— แกรม

6
@ Graeme ดำเนินการต่อการวนซ้ำด้วยการระงับซ้ำหนึ่งดูเหมือนว่าเป็นอันตรายสำหรับฉันเพราะขั้นตอนต่อไปอาจขึ้นอยู่กับก่อนหน้านี้ ทางออกเดียวที่สมเหตุสมผลสำหรับฉันคือการระงับทั้งลูปและสามารถทำได้ใน subshell (อันที่จริงแล้วzshสามารถระงับทั้งลูปที่รันในเชลล์ปัจจุบัน)
— jimmij

3
นั่นอาจเป็นคำตอบ - bashนักพัฒนามีความเห็นเช่นเดียวกับคุณ การวนรอบต่อไปยังคงเป็นสิ่งที่ฉันคาดหวังไว้แม้ว่าเมื่อคุณหยุดกระบวนการและการควบคุมด้วยมือกลับไปที่เปลือกดูเหมือนว่าเป็นเรื่องปกติที่จะรับตำแหน่งที่เหลือ (และอาจเป็นพฤติกรรมในbashกรณีที่พวกเขาไม่ได้เพิ่ม รหัสที่จะทำอย่างอื่น)
— แกรม
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.