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


41

ฉันคาดว่าจะได้รับสะเก็ดระเบิดนี้ แต่ฉันไม่สามารถหาคำตอบได้ทุกที่ ดูเหมือนว่ามันควรจะชัดเจน บางครั้งเมื่อฉันพิมพ์คำสั่งที่ไม่ดีในเทอร์มินัล bash เคอร์เซอร์เพิ่งกระโดดลงไปที่บรรทัดถัดไปโดยไม่มีข้อผิดพลาดหรืออะไร ฉันไม่สามารถบอกสิ่งที่ฉันทำผิด มันเหมือนกับว่าฉันติดอยู่ในโปรแกรม แนคท์:

$ tidy

ฉัน: "อ๊ะ! นั่นไม่ใช่สิ่งที่ฉันต้องการพิมพ์ ... "

:q

ฉัน: "นั่นไม่ได้ผล ... "

:exit
:quit
exit
quit
/exit
/quit
-exit
-quit
-wtf???

ฉันรู้ว่าฉันเมาแล้ว แต่ฉันจะกลับไปที่พรอมต์ได้อย่างไรโดยไม่ต้องปิดเครื่อง



:qใช้งานได้จริงสำหรับฉัน; นั่นไม่ใช่คำสั่ง Vim ใช่ไหม
ถั่วแดง

คำตอบ:


53

คุณสามารถลองสิ่งที่เห็นได้ชัดเช่น^C, ^D(EOF), หลบหนี ฯลฯ แต่ถ้าทุกอย่างล้มเหลวฉันมักจะจบลงด้วยการระงับคำสั่งด้วย^Z(Control-Z) ซึ่งทำให้ฉันกลับเข้ามาในเปลือก

จากนั้นฉันจะทำpsคำสั่งและจดบันทึก PID (id กระบวนการ) ของคำสั่งแล้วออกคำสั่งkill thePID( kill -9 thePIDถ้าอดีตไม่ทำงาน) เพื่อยกเลิกแอปพลิเคชัน

โปรดทราบว่านี่ไม่ใช่วิธีที่เรียบร้อย (ไม่มีการเล่นสำนวน) เพื่อยกเลิกแอปพลิเคชั่น / คำสั่งและคุณเสี่ยงต่อการที่อาจไม่มีการบันทึกข้อมูล ฯลฯ

ตัวอย่าง (ฉันเคยใช้tidyแต่ฉันยังไม่ได้ติดตั้ง):

$ gnuplot

    G N U P L O T
    Version 4.2 patchlevel 6 
     ....
    Send bug reports and suggestions to <http://sourceforge.net/projects/gnuplot>

Terminal type set to 'wxt'
gnuplot> 
gnuplot>               #####  typed ^Z here
[1]+  Stopped                 gnuplot
$ ps
  PID TTY          TIME CMD
 1681 pts/1    00:00:00 tcsh
 1690 pts/1    00:00:00 bash
 1708 pts/1    00:00:00 gnuplot
 1709 pts/1    00:00:00 ps


$ kill 1708            ###### didn't kill the command as ps shows

$ ps
  PID TTY          TIME CMD
 1681 pts/1    00:00:00 tcsh
 1690 pts/1    00:00:00 bash
 1708 pts/1    00:00:00 gnuplot
 1710 pts/1    00:00:00 ps
$ kill -9 1708           ### -9 did the trick
$ 
[1]+  Killed                  gnuplot

$ ps
  PID TTY          TIME CMD
 1681 pts/1    00:00:00 tcsh
 1690 pts/1    00:00:00 bash
 1711 pts/1    00:00:00 ps

8
แค่นั้นแหละ!! ^ Z เพื่อช่วยเหลือ ขอบคุณมาก.
David Kennedy

3
^ \ (ctrl-backslash, SIGQUIT) ทำงานในยูทิลิตี้ที่ดื้อรั้นที่ไม่ตอบสนองต่อ ^ C
mrb

2
Shh! อย่าบอกคนเกี่ยวกับ ^ \ ไม่เช่นนั้นพวกเขาก็จะเริ่มต้นทำSIG_IGNเช่นนั้นแล้วเราจะทำอย่างไรดี?
Alan Curry

1
@godlygeek คุณสามารถบอกฉันได้ว่า %% มีความหมายใน Linux อย่างไร ฉันค้นหามาก
Noumenon

1
@Noumenon, LESS='+/^JOB CONTROL' man bashมีลักษณะที่ %%อ้างถึง "งานปัจจุบัน"
Wildcard

12

ลองกดCtrl- Dหรือ-Ctrl Cถ้ามันล้มเหลวฆ่ากระบวนการ

ลองtidyคำสั่งที่คุณพูดถึงCtrl- Dใช้ได้


CTRL+Cเป็นสิ่งที่ดีสำหรับ windows CMD เช่นกัน
T.Todua

7

วิธีแก้ปัญหาอื่น (ยังไม่ได้กล่าวถึง) คือการส่งSIGQUITสัญญาณโดยใช้ctrl+\

มันแข็งแกร่งกว่าctrl+c


2

CTRL+D == exit shell command

และ

CTRL+ C == terminate the current process, Of course may be the given software handle it and CTRL+D doens't work

แน่นอนพวกเขาผลิตkernel signalถ้าคุณต้องการทราบข้อมูลเพิ่มเติมอ่าน:

man 7 signal

3
Ctrl + D เป็นจุดสิ้นสุดไฟล์ไม่ใช่ออกโดยตรง
Gilles 'หยุดความชั่วร้าย'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.