ฉันกำลังวิ่งอยู่ในทุบตี:
for i in ull-*.pbm; do convert $i tmp2/$i.pdf ; done
ฉันCtrl-Zอยู่ในระหว่างการทำงานและจากนั้นfgid งานของมัน แต่การวนซ้ำที่เหลือยังไม่เสร็จสิ้น ฉันสงสัยว่าทำไม?
ฉันกำลังวิ่งอยู่ในทุบตี:
for i in ull-*.pbm; do convert $i tmp2/$i.pdf ; done
ฉันCtrl-Zอยู่ในระหว่างการทำงานและจากนั้นfgid งานของมัน แต่การวนซ้ำที่เหลือยังไม่เสร็จสิ้น ฉันสงสัยว่าทำไม?
คำตอบ:
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ได้
Ctrl-Zสามารถหยุดอินสแตนซ์ของการแปลงเพียงอันเดียวได้, ไม่มีเหตุผลที่ลูปไม่สามารถดำเนินการต่อและเริ่มต้นใหม่ได้ ด้วยเหตุผลบางอย่างbashหยุดการวนซ้ำ เมื่อฉันทดสอบในdashลูปต่อไปเชลล์อื่นอาจทำเช่นเดียวกัน
zshสามารถระงับทั้งลูปที่รันในเชลล์ปัจจุบัน)
bashนักพัฒนามีความเห็นเช่นเดียวกับคุณ การวนรอบต่อไปยังคงเป็นสิ่งที่ฉันคาดหวังไว้แม้ว่าเมื่อคุณหยุดกระบวนการและการควบคุมด้วยมือกลับไปที่เปลือกดูเหมือนว่าเป็นเรื่องปกติที่จะรับตำแหน่งที่เหลือ (และอาจเป็นพฤติกรรมในbashกรณีที่พวกเขาไม่ได้เพิ่ม รหัสที่จะทำอย่างอื่น)
for i in *.txt; do echo "$i"; sleep 0.5 ; done(GNU bash, รุ่น 4.2.53)