Ctrl-C giết chết toàn bộ dòng trong khi Ctrl-Z không


8

Tôi đang chạy nhiều lệnh trên dòng lệnh được phân tách bằng dấu chấm phẩy:

cmd1; cmd2; cmd3

Nếu tôi nhấn Ctrl+ Cở trên, nó sẽ giết tất cả các lệnh thay vì chỉ một lệnh hiện đang thực thi.

kartik@kartikpc:~/junk/exp$ ls
test1  test2
kartik@kartikpc:~/junk/exp$ cat; ls
cat is running
cat is running
^C
kartik@kartikpc:~/junk/exp

Nhưng Ctrl+ Zsẽ chỉ tạm dừng quá trình hiện tại và tiếp tục với quy trình tiếp theo.

kartik@kartikpc:~/junk/exp$ ls
test1  test2
kartik@kartikpc:~/junk/exp$ cat; ls
cat is running 
cat is running
^Z
[1]+  Stopped                 cat
test1  test2
kartik@kartikpc:~/junk/exp$

Tại sao có sự phân tán trong hành vi, và có cách nào để thực hiện Ctrl+ Chành xử như Ctrl+ Z?

Tôi thực sự đang chạy một máy chủ thông qua phiên tmux như sau node app.js; $bashvà khi tôi thực hiện Ctrl+ Cđể giết máy chủ, nó cũng sẽ giết bash. Tôi muốn trở về vỏ. Có cách nào khác để đạt được hành vi tôi muốn không?

[CẬP NHẬT]

tcshhành xử tương tự với Ctrl+ CCtrl+ Z. Nó sẽ luôn hành động trên tất cả các lệnh giống như bash đang làm với onlt Ctrl+ C. Nhưng mang lại công việc với fgsẽ chỉ mang lại catvà không ls.

[kartika@vm-kartika-vnc ~/junk]$ ls
file1  file2
[kartika@vm-kartika-vnc ~/junk]$ echo $SHELL
/bin/tcsh
[kartika@vm-kartika-vnc ~/junk]$ cat; ls
cat is running 
cat is running
^C
[kartika@vm-kartika-vnc ~/junk]$ cat ; ls
cat is running
cat is running
^Z
Suspended
[kartika@vm-kartika-vnc ~/junk]$ jobs
[1]  + Suspended                     cat
[kartika@vm-kartika-vnc ~/junk]$ fg
cat                                     // Pressing ctrl-d here to exit cat
[kartika@vm-kartika-vnc ~/junk]$ 

Thông tin hệ thống:

kartik@kartikpc:~/junk/exp$ uname -a
Linux kartikpc 3.13.0-70-generic #113-Ubuntu SMP Mon Nov 16 18:34:13 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
kartik@kartikpc:~/junk/exp$ echo $SHELL
/bin/bash

grep SigIgn /proc/$$/status4 bit ở vị trí thấp nhất? Đó thường là trường hợp. Sau đó, bạn có thể gõ Control-backslash để gửi SIGQUIT để hủy công việc nền trước mà không làm cho shell loại bỏ phần còn lại của dòng lệnh. Nhưng nó có thể tạo ra một kết xuất cốt lõi của công việc nền trước, tùy thuộc vào cấu hình của bạn.
Đánh dấu Plotnick

Câu trả lời:


6

Bạn cần phải tìm kiếm kiểm soát công việc bash. Có một lời giải thích hợp lý ở đây: http://web.mit.edu/gnu/doc/html/features_5.html

Nhưng trong một tóm tắt Ctrl+ Csẽ giết các lệnh (tất cả các dòng) và Ctrl+ Zsẽ làm nền cho lệnh đang chạy. Trong trường hợp của bạn, nó là nền cat(thay thế đầu ra và dừng xử lý) và sau đó tiếp tục chạy lslệnh.

Bạn có thể xác nhận điều này bằng cách kiểm tra danh sách quy trình và bạn sẽ thấy bạn catvẫn còn trong danh sách.

Để đưa công việc đó lên tiền cảnh, hãy nhìn vào fglệnh.


Tôi thực sự đang chạy một máy chủ thông qua tmux như sau node app.js; $bashvà khi tôi thực hiện ctrl-c để giết máy chủ, nó cũng sẽ giết bash. Tôi muốn trở về vỏ. Có cách nào khác để đạt được hành vi tôi muốn không?
Kartik Anand

0

Nếu node ...;$bashthứ đó được đẩy vào bộ đệm đầu vào pty tmux, thì một giải pháp khả thi là cấu hình thiết bị đầu cuối một cách thích hợp, trapngắt thiết bị đầu cuối theo cách chỉ ảnh hưởng đến vỏ tương tác và sử dụng dòng mới thay vì ;.

stty noflsh; trap : INT

^ nên xử lý hai yêu cầu đầu tiên.

Sự khác biệt giữa a ;và a \nlà do cách shell đọc đầu vào - ;dấu chấm phẩy tương đương với một dòng mới trong đó nó phân định danh sách lệnh, nhưng nó khác ở chỗ nó không phân định đầu vào đọc. Ví dụ:

prompt$ cat; echo something

this the cat process
this the cat process
^C
prompt$

Nhưng bởi vì tôi đã cấu hình trình điều khiển tty không xóa bộ đệm đầu vào khi nhận được ngắt với stty noflsh:

prompt$ cat^Jecho something

this is the cat process
this is the cat process
^C
something
prompt$

bash's readlinethực sự sẽ hiển thị một dòng mới đen cho phím combo Ctrl+ Vsau đó Ctrl+ Jchứ không phải thoát trình bày ở trên, nhưng hiệu quả là như nhau: khi vỏ bản thân một cách hiệu quả lờ ngắt nhưng con của nó không, bạn có thể thực hiện gián đoạn dòng của tty đầu vào nối tiếp miễn là bản thân thiết bị đầu cuối không loại bỏ hoàn toàn đầu vào bị gián đoạn.

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.