Làm thế nào tôi có thể hủy phần còn lại của danh sách các lệnh trong Bash?


10

Trong Bash, thỉnh thoảng tôi sẽ gõ vào một danh sách các lệnh và nhấn Entervà chỉ sau đó nhận ra rằng có một lỗi với một số lệnh ở gần cuối danh sách. Tôi biết rằng nếu tôi nhấn Ctrl+ Cnó sẽ chấm dứt lệnh hiện đang chạy và hủy phần còn lại của danh sách. Có cách nào để hủy phần còn lại của danh sách mà không chấm dứt lệnh hiện đang chạy không?

Ví dụ: giả sử tôi đã gõ một cái gì đó như

foo; bar

hoặc là

foo && bar

trong đó foomột lệnh chạy dài mà rất quan trọng là không làm gián đoạn và barthực hiện một cái gì đó không thể đảo ngược và không mong muốn (nói, shutdown -h nowhoặc rm -rf /). Trong khi foovẫn đang chạy, có một cách chung để nói với vỏ để foohoàn thành nhưng không chạy barsau đó? (Vâng, tôi có thể thay đổi các điều khoản trên barđể nó không thực thi, nhưng đó không phải là đặc biệt tiện lợi nếu barlà một cái gì đó giống như rmlà tôi muốn sử dụng trong khi chờ đợi, và cũng không nó sẽ làm việc nếu tôi không làm riêng barhoặc nếu barlà một dựng sẵn.)


Bạn có thể sửa đổi barlệnh cuối cùng thành some_command: ^bar^some_commandtrước khi được thực thi.
GAD3R

3
@ GAD3R: nhưng điều này sẽ không sửa đổi dòng hiện tại, nó sẽ bắt đầu một dòng mới.
Arkadiusz Drabchot

Câu trả lời:


3

Tôi đã quan sát thấy rằng việc sử dụng CtrlZđể chuyển chương trình sang một quá trình nền sẽ thực hiện thủ thuật.

foo && bar

Cảm ơn @Arkadiusz Drabchot đã chỉ ra nó trong các bình luận foo; barkhông kiểm soát theo cách được yêu cầu.

Sau đó:

^Z

[1]+  Stopped                 foo

Lệnh chỉ dừng nhiệm vụ đầu tiên và

fg %1

Điều này chỉ mang lại nhiệm vụ foocho tiền cảnh và hoàn thành nhiệm vụ và thoát.

PS: Điều này có thể được kiểm tra với hai tập lệnh ghi vào một tập tin. Người đầu tiên ngủ trong vài giây để cho thời gian được đặt lại.

Tôi không biết tại sao CtrlZtay cầm chỉ chạy lệnh và bỏ phần còn lại. Rất thích được làm quen.


1
Tôi không thể tái tạo nó. Bạn bashsử dụng phiên bản nào? Tôi sử dụng GNU bash, version 4.3.46(1)-release (x86_64-slackware-linux-gnu). Tôi đã viết 2 tập lệnh bash ghi vào các tệp khác nhau write1.sh:: pastebin.com/rbKmdWgBwrite2.sh: pastebin.com/bNx3VRws . Tôi chạy chúng như thế : ./write1.sh ; ./write2.sh. Kịch bản đầu tiên lặp lại wrote 1một vài lần, tôi nhấn C-z, nó nói [1]+ Stopped ./write1.shvà tôi có thể thấy ngay đầu ra của tập lệnh thứ hai: wrote 2được lặp lại nhiều lần.
Arkadiusz Drabchot

2
Tôi nghĩ lý do mà phương pháp này hoạt động với các command1 && command2đường ống là để Control-zgửi SIGCHLDtín hiệu đến quá trình. Nó có thể được kiểm tra với echo $?. Bashsau đó thấy rằng quá trình đầu tiên không kết thúc thành công và không thực hiện các quy trình tiếp theo.
Arkadiusz Drabchot

Tôi đang sử dụng GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin16). Vâng, tôi nghĩ bạn đúng. foo; barkhông thể được kiểm soát theo cách mong muốn. Nhưng chúng ta có thể thực hiện dừng yêu cầu của quy trình thứ hai Ctrl+Znếu lệnh chạy là foo && bar. Tôi sẽ cập nhật câu trả lời. Cảm ơn vì chỉ ra điều ấy.
Revanth Chetluru

@ArkadiuszDrabchot không Ctrl-Z gửi SIGTSTP?
muru

@RevanthChetluru lưu ý rằng barvẫn bị treo và hiển thị ở jobsđầu ra, vì vậy có lẽ nó cũng nên bị giết.
muru
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.