Báo lại tiến trình từ một quá trình nền mà không cần chiếm quyền điều khiển


10

Hãy xem xét các kịch bản đơn giản hello:

#!/bin/bash

echo 'hello world!'

Bây giờ từ bash nếu tôi cố chạy cái này trong nền:

$ hello &
[1] 12345
$ hello world!
 <--- prompt is stuck here until I hit enter!
[1]+ Done
$  <--- prompt back to normal

Những gì tôi muốn nhìn thấy:

$ hello &
[1] 12345
[1]+ hello world!
[1]+ Done
$  <--- prompt normal the whole time

Làm thế nào tôi có thể thay đổi hành vi?

Câu trả lời:


13

Đó là vấn đề thời gian: bash khởi chạy hellolệnh trong nền, sau đó nó hiển thị lời nhắc để cho phép bạn nhập một lệnh mới, sau đó lệnh nền sẽ in một số đầu ra. Khi bạn nhập dòng tiếp theo lệnh (một dòng lệnh trống, nếu bạn chỉ cần bấm Enter), màn hình bash được thông báo rằng công việc nền đã hoàn tất, sau đó nhắc tới.

Bạn có thể muốn thử nghiệm một tập lệnh bắt đầu sleep 3và bắt đầu nhập ngay sau khi khởi chạy tập lệnh ở chế độ nền, để xem những gì đang xảy ra với tốc độ bạn có thể theo dõi.

Bạn có thể làm cho bash thông báo cho bạn ngay lập tức khi công việc nền kết thúc bằng cách đặt notifytùy chọn với set -b. Sau đó, bạn sẽ thấy:

$ set -b
$ hello &
[1] 12345
$ hello world!
[1]+ Done

Bash không vẽ lại lời nhắc trong trường hợp này. Bạn vẫn đang chỉnh sửa một dòng lệnh trên dòng nhắc xuất hiện trước khi công việc nền được in hello world!. Bạn có thể vẽ lại dòng hiện tại bằng cách nhấn Esc 1 Ctrl+ L. Bạn có thể muốn liên kết lệnh redraw-current-linevới một khóa thuận tiện hơn; ví dụ: để có Ctrl+ Lvẽ lại dòng hiện tại và Ctrl+ Alt+ Lxóa màn hình, hãy thêm các dòng sau vào ~/.inputrc:

"\C-l": redraw-current-line
"\e\C-l": clear-screen

Tôi không biết cách nào để bash vẽ lại dòng nhắc nhở tự động. Zsh làm điều đó theo mặc định.

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.