ฉันจะยกเลิกรายการคำสั่งที่เหลือใน Bash ได้อย่างไร?


10

ใน Bash บางครั้งฉันจะพิมพ์รายการคำสั่งและการเข้าชมEnterและต่อมาก็ตระหนักว่ามีข้อผิดพลาดบางคำสั่งใกล้จะจบรายการ ฉันรู้ว่าถ้าฉันกดCtrl+ Cมันจะยุติคำสั่งที่กำลังทำงานอยู่และยกเลิกรายการที่เหลือ มีวิธีการยกเลิกรายการที่เหลือโดยไม่ยกเลิกคำสั่งที่กำลังทำงานอยู่หรือไม่?

ตัวอย่างเช่นสมมติว่าฉันพิมพ์บางสิ่งบางอย่างเช่น

foo; bar

หรือ

foo && bar

ซึ่งfooเป็นคำสั่งที่ใช้เวลานานซึ่งเป็นสิ่งสำคัญมากที่จะไม่ขัดจังหวะและbarทำสิ่งที่ไม่สามารถแก้ไขได้และไม่ต้องการ (พูดshutdown -h nowหรือrm -rf /) ในขณะที่fooยังทำงานอยู่มีวิธีทั่วไปในการบอกเชลล์ให้fooเสร็จ แต่จะไม่ทำงานในbarภายหลังหรือไม่? (ใช่ฉันสามารถเปลี่ยนการอนุญาตbarเพื่อไม่ให้ใช้งานได้ แต่มันไม่สะดวกbarเป็นพิเศษหากเป็นอย่างrmที่ฉันต้องการใช้ในระหว่างนี้และจะไม่ทำงานหากฉันไม่ได้เป็นเจ้าของbarหรือbarเป็นบิวอิน)


คุณสามารถแก้ไขbarคำสั่งสุดท้ายเป็นsome_command: ^bar^some_commandก่อนที่จะดำเนินการ
GAD3R

3
@ GAD3R: แต่นี่จะไม่แก้ไขบรรทัดปัจจุบันมันจะเริ่มใหม่
Arkadiusz Drabczyk

คำตอบ:


3

ฉันสังเกตุเห็นว่าการใช้โปรแกรมCtrlZเพื่อเปลี่ยนเป็นแบ็คกราวน์นั้นเป็นการหลอกลวง

foo && bar

ขอบคุณ @Arkadiusz Drabczyk ที่ชี้ไปในความคิดเห็นที่foo; barไม่สามารถควบคุมได้ตามที่ต้องการ

แล้ว:

^Z

[1]+  Stopped                 foo

คำสั่งหยุดงานแรกเท่านั้นและ

fg %1

สิ่งนี้จะนำเฉพาะภารกิจfooไปยังเบื้องหน้าและทำภารกิจและออกให้เสร็จสมบูรณ์

PS: สิ่งนี้สามารถตรวจสอบได้ด้วยสองสคริปต์ที่เขียนไปยังไฟล์ คนแรกนอนหลับไม่กี่วินาทีเพื่อให้เวลาที่จะนำกลับมา

ฉันหลงทางว่าทำไมตัวCtrlZจัดการเท่านั้นที่รันคำสั่งและออกจากที่เหลือ ชอบที่จะได้รับรู้


1
ฉันทำซ้ำไม่ได้ สิ่งที่bashคุณไม่รุ่นใช้? GNU bash, version 4.3.46(1)-release (x86_64-slackware-linux-gnu)ฉันใช้ ผมเขียนสคริปต์ทุบตี 2 ที่เขียนไปยังไฟล์ที่แตกต่างกันwrite1.sh: pastebin.com/rbKmdWgBและwrite2.sh: pastebin.com/bNx3VRws ./write1.sh ; ./write2.shผมเรียกพวกเขาเช่นเดียวกับที่: สคริปต์แรกก้องwrote 1สองสามครั้งฉันกดC-zมันจะบอกว่า[1]+ Stopped ./write1.shและฉันสามารถดูผลลัพธ์ของสคริปต์ที่สองได้ทันที: wrote 2ถูกสะท้อนซ้ำ ๆ
Arkadiusz Drabczyk

2
ฉันคิดว่าเหตุผลที่วิธีนี้ใช้ได้กับcommand1 && command2ท่อControl-zส่งSIGCHLDสัญญาณนั่นคือการส่งสัญญาณไปยังกระบวนการ echo $?มันสามารถตรวจสอบได้ด้วย Bashจากนั้นเห็นว่ากระบวนการแรกไม่เสร็จสมบูรณ์และไม่ดำเนินการกระบวนการถัดไป
Arkadiusz Drabczyk

GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin16)ฉันใช้ ใช่ฉันคิดว่าคุณพูดถูก foo; barไม่สามารถควบคุมได้ในวิธีที่ต้องการ แต่เราสามารถทำป้ายต้องของกระบวนการที่สองกับถ้าวิ่งคำสั่งคือCtrl+Z foo && barฉันจะอัปเดตคำตอบ ขอบคุณสำหรับการชี้ให้เห็น
Revanth Chetluru

@ArkadiuszDrabczyk ไม่ Ctrl-Z ส่ง SIGTSTP?
muru

@RevanthChetluru ทราบว่าbarยังคงถูกระงับและปรากฏในjobsผลลัพธ์ดังนั้นมันน่าจะถูกฆ่าด้วย
muru
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.