Làm thế nào để bạn gửi các ứng dụng dòng lệnh trực tiếp đến nền?


22

Tôi đã biết rằng nhấn ctrl+zdừng ứng dụng, sau đó tôi có thể gửi ứng dụng đến nền bằng bglệnh, nhưng điều đó có nghĩa là có một khoảng thời gian ngắn mà ứng dụng bị dừng.

Làm cách nào để gửi ứng dụng trực tiếp xuống nền mà không dừng ứng dụng?


Chắc chắn bạn không thể, nếu nó đã chạy.
Kevin

1
Nếu tác vụ của bạn yêu cầu đầu vào của bạn "trước khi biến mất" vào nền, bạn có thể sử dụng các công cụ như zenity hoặc yad (nếu bạn thích guis). Họ vẫn có thể gửi và nhận đầu ra từ nền. Tôi chắc chắn rằng chơi với ống và thiết bị cũng sẽ giúp bạn truy cập vào bảng điều khiển từ nền, nhưng tôi không chắc làm thế nào để làm điều đó.
Joe

@Joe Thật tuyệt, nhưng ý tôi không phải thế. Tôi chỉ muốn gửi một ứng dụng trực tiếp đến nền mà không tạm dừng nó. tức là không cần nhấn ctrl+ztheo sau là chạy lệnh bg. Có một tổ hợp phím duy nhất để gửi ứng dụng đến nền không?
trusktr

Câu trả lời:


17

Gửi một ứng dụng từ nền trước đến nền đòi hỏi sự hợp tác từ cả thiết bị đầu cuối và vỏ. Thiết bị đầu cuối không thể làm điều đó một mình, vì trình bao phải đặt nhóm quy trình tiền cảnh. Shell không thể làm điều đó một mình, vì thiết bị đầu cuối phải xử lý phím bấm (vỏ không ở phía trước, vì vậy nó không thể nhận được nhấn phím).

Một xấp xỉ gần đúng là gửi ứng dụng đến nền rất nhanh. Rốt cuộc, một ứng dụng chia sẻ thời gian CPU với những người khác và tạm dừng vài phần trăm giây không thành vấn đề. (Nó dành cho các ứng dụng thời gian thực, vì vậy hãy đảm bảo khởi động những ứng dụng trong nền.) Tôi sử dụng một ràng buộc shell cho Ctrl+ Zđể gửi công việc được tạo nền trước cho nền. Bằng cách đó, nhấn Ctrl+ Z Ctrl+ Zsẽ gửi một công việc đến nền với thời gian treo tối thiểu.

Đây là ràng buộc zsh của tôi, cũng là một nền tảng khác, một lệnh nửa gõ khi dòng lệnh không trống .

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

Trong tiếng Anh, dành cho những người không sử dụng zsh trong đối tượng:

  • Xác định hàm shell thực hiện các thao tác sau:

    • Nếu độ dài của bộ đệm đầu vào là 0, sau đó đặt công việc hiện tại (công việc bị đình chỉ hoặc bắt đầu lần cuối) vào nềnhiển thị lại lời nhắc.
    • Nếu không, đẩy bộ đệm đầu vào lên một ngăn xếp và hiển thị một dấu nhắc mới. Khi người dùng nhập lệnh hoặc hủy lệnh bằng Ctrl+ C, bộ đệm được đẩy trở lại cho phiên bản tiếp theo.
  • Liên kết hàm này với Ctrl+ Z.

Nếu bạn chỉ muốn hành vi nền bất kể dòng lệnh có trống không:

function bg_ { builtin bg "$@"; }
zle -N bg_
bindkey '^Z' bg_

Tôi không biết nếu bạn có thể làm điều tương tự trong bash. Nó phải dễ như bind -x '"\C-z": bg', ngoại trừ việc bash để lại ký tự tty stop, vì vậy nó không bao giờ được Ctrl+ Zlàm đầu vào.


Thật thú vị, hãy để tôi xem nếu điều này có thể được thực hiện trong Bash. Nếu vậy, đây sẽ là một giải pháp. Tôi không quen thuộc với zsh. Tâm giải thích kịch bản của bạn làm gì?
trusktr

@trusktr Xem chỉnh sửa của tôi.
Gilles 'SO- ngừng trở nên xấu xa'

Cảm ơn! Tôi sắp chuyển sang zsh. Tôi đã nghe rất nhiều thứ hay ho về nó.
trusktr

15

Bạn có thể làm nền một tác vụ bằng cách thêm vào &sau nó.

Ví dụ tail -f /var/log/messages &sẽ nền tảng nhiệm vụ ngay lập tức.

Như mọi khi bạn có thể thấy những nhiệm vụ bạn đã làm nền với jobslệnh.

Điều này tất nhiên giả định rằng bạn chưa chạy lệnh.


Điều đó hữu ích, nhưng ý tôi không phải thế. Nếu tôi có ứng dụng ở phía trước, sau đó muốn gửi nó đến nền sau, tôi có thể nhấn ctrl+zrồi thực hiện bgtại dòng lệnh để ứng dụng chạy trong nền. Nhưng giữa việc nhấn ctrl+zvà thực thi bg, có một khung thời gian mà ứng dụng bị tạm dừng hoàn toàn. Tôi không muốn điều đó. Làm thế nào để tôi gửi nó đến nền ngay lập tức ?
trusktr

@trusktr như Gilles nói. Bạn cần thông báo cho cả vỏ và thiết bị đầu cuối. Xin lỗi, tôi không biết cách nào để làm điều đó.
prateek61

Nó không trả lời câu hỏi.
Luciano Andress Martini

4

Bối cảnh một lệnh được thực hiện bằng cách nối thêm dấu và vào lệnh.

sleep 300 &

Nếu nó đã chạy, tùy chọn duy nhất của bạn là dừng nó, sau đó chạy nền.


Giữa việc nhấn ctrl + z và thực thi bg, có một khung thời gian mà ứng dụng bị tạm dừng hoàn toàn, đó là điều tôi không muốn. Vì vậy, không có cách nào để gửi nó đến nền ngay lập tức ?
trusktr

1
Không. Như Giles đã nói, nó cần cả vỏ và thiết bị đầu cuối. Bạn cần thông báo cho từng.
bahamat
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.