Làm cách nào tôi có thể thực hiện Ctrl-Z và bg trong một lần nhấn phím để tiếp tục quá trình ở chế độ nền?


25

Tôi theo mô hình đình chỉ nhiệm vụ này và sau đó để nó tiếp tục quá thường xuyên với Ctrl-Z bgchuỗi.

Tôi đã tự hỏi có cách nào để nén nó vào một lần nhấn phím không?

Vỏ của tôi là zsh


Tôi muốn nói rằng có lẽ là mã hóa cứng. Nhưng tôi không phải là 100%
Chad Harrison

Chắc chắn là có, nhưng tôi đã tìm thấy giải pháp tao nhã, cảm ơn bạn superuser.com/a/161922/35223
Evgeniy Dolzhenko

Câu trả lời:


24

Trình tự Ctrl+ Zđược xử lý bởi thiết bị đầu cuối, không phải bởi trình bao. (Nền tảng hữu ích: Sự khác biệt chính xác giữa 'thiết bị đầu cuối', 'vỏ', 'tty' và 'bàn điều khiển' là gì? )

Chỉ một tập hợp nhỏ các chức năng không thể mở rộng có thể được liên kết với một khóa trong một thiết bị đầu cuối . Bạn có thể tùy chỉnh các phím bị ràng buộc với các chức năng này nhưng không thêm chức năng khác. Các chức năng này thuộc ba loại:

  • Phiên bản dòng lệnh trong các chương trình không cung cấp riêng (chế độ chính tắc, còn được gọi là chế độ nấu (do đối lập với chế độ thô), mà bạn sẽ hiếm khi sử dụng trong thực tế): kết thúc tệp ( eof, Ctrl+ D), cuối dòng ( eol, Ctrl+ M), xóa ký tự bên trái ( erase, Ctrl+ H), xóa từ trái ( werase, Ctrl+ W), xóa dòng ( kill, Ctrl+ U).
  • Điều khiển lưu lượng thủ công: stop( Ctrl+ S), start( Ctrl+ Q). Chỉ hữu ích trên các thiết bị đầu cuối nối tiếp cũ đã bỏ các ký tự khi thiết bị đầu cuối không thể theo kịp máy tính hoặc ngược lại.
  • Báo hiệu: ngắt ( intr, Ctrl+ C), buộc thoát ( quit, Ctrl+ \), tạm dừng ( Ctrl+ Z).

Một số hệ thống, bao gồm cả Linux, mở rộng danh sách đó, nhưng tôi chưa bao giờ thấy một hệ thống nào bao gồm nền. Lưu ý rằng nó sẽ hỗ trợ cả trong trình điều khiển đầu cuối trong kernel và trong trình giả lập thiết bị đầu cuối. Vì vậy, bạn phải thực hiện với việc tạm dừng, điều này sẽ gửi công việc tiền cảnh một tín hiệu SIGTSTP . Điều này kích hoạt SIGCHLD trong quy trình cha của nhà lãnh đạo công việc tiền cảnh, thường là vỏ. Khi shell nhận được SIGCHLD, nó gọi waitpidđể tìm hiểu lý do tại sao nó được thông báo và khi phát hiện ra rằng một công việc nền bị đình chỉ, nó sẽ hiển thị một thông báo (ví dụ [1] + 12345 suspended mycommand) và một dấu nhắc mới.

Bạn có thể lập trình shell để gửi SIGCONTtín hiệu đến công việc nền trước. Tôi không nghĩ zsh có một cái móc cho điều đó, bạn cần vá mã nguồn. Và không có cách nào để zsh biết bạn thực sự có ý định làm gián đoạn chương trình (rất tiếc, chương trình này có thể đang làm sai, hãy để tôi tạm dừng nó trong khi tôi sắp xếp nó) hoặc để làm nền cho nó.


Những gì tôi làm là đặt chuỗi phím Ctrl+ Ztrong zsh để làm nền cho công việc hiện tại ( %%). Bằng cách đó, tôi có thể gửi công việc nền trước tới nền bằng cách nhấn Ctrl+ Z Ctrl+ Z. Trong khi tôi đang ở đó, tôi tạo Ctrl+ Zlàm một cái gì đó hữu ích khi dòng đầu vào hiện tại không trống (vì vậy tôi chưa quay lại từ một quy trình con): , sau đó dòng bị gián đoạn được đẩy trở lại vào bộ đệm đầu vào.

fancy-ctrl-z () {
  if [[ $#BUFFER -eq 0 ]]; then
    bg
    zle redisplay
  else
    zle push-input
  fi
}
zle -N fancy-ctrl-z
bindkey '^Z' fancy-ctrl-z

Gilles, đây là một câu trả lời cực kỳ đầy đủ, có tính giáo dục và chu đáo mà tôi không thể mong đợi nhận được! Cảm ơn bạn rất nhiều!
Evgeniy Dolzhenko

2

^ z ^ z như zsh ở trên là có thể trong bash, mặc dù nó hơi độc và tôi đã không chạy nó lâu:

  • Trong .inputrc của bạn bao gồm ánh xạ "\C-z": "bg\n"
  • Trong biến bash PS0 bao gồm `$ (stty Susp ^ z) '
  • Trong biến bash PROMPT_COMMAND bao gồm 'stty Susp ^ @'

vì vậy ^ z cho đình chỉ được bật khi một lệnh được chạy, sau đó tắt cho dấu nhắc bash.


1

Vì vậy, tìm thấy giải pháp, không chính xác những gì tôi muốn nhưng gần gũi từ đây /superuser//a/161922/35223

Trên một dòng lệnh trống chạy bg (để Ctrl + Z Ctrl + Z tạm dừng một chương trình và ngay lập tức tiếp tục nó trong nền).


Tôi sẽ lưu ý rằng điều này đòi hỏi zsh; nó không được hỗ trợ trong bash. (ra khỏi hộp, dù sao đi nữa)
Kevin M

@KevinM Bạn có thể viết một hàm tương tự trong bash (ít nhất là phiên bản cơ bản thực hiện Ctrl+Zcuộc gọi bg, tôi không chắc chắn về việc phát hiện một dòng đầu vào không trống).
Gilles 'SO- ngừng trở nên xấu xa'

0

Đây có phải là những lệnh mà bạn muốn chạy ở nền trước, sau đó chuyển sang nền không? Tôi không biết nếu có một cách đơn giản hơn để làm điều đó. Nhưng nếu bạn muốn chạy các lệnh sẽ ở chế độ nền để bắt đầu, bạn có thể chỉ cần thêm một dấu và vào cuối dòng. ví dụ, ping google.com &sẽ bắt đầu ping trong nền; bạn sẽ không thể tương tác với nó trừ khi bạn gõ fg.


1
Cảm ơn, vấn đề là đôi khi bạn không có ý tưởng về việc chạy lệnh sẽ mất bao nhiêu thời gian, vì vậy bạn chạy tương tác và sau đó nhận ra bạn tốt hơn hãy để nó tiếp tục trên nền. Câu trả lời được chấp nhận làm việc kỳ diệu đối với tôi, sử dụng nó hàng ngày!
Evgeniy Dolzhenko

Cảm ơn vì sự trả lời. Câu trả lời được chấp nhận là khá gọn gàng!
octern
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.