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 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
Câu trả lời:
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:
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).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.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 SIGCONT
tí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
^ 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:
"\C-z": "bg\n"
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.
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).
Ctrl+Z
cuộ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).
Đâ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
.