Có cách nào để cung cấp các tác vụ nối tiếp trên thiết bị đầu cuối trong khi một tác vụ đang thực thi (không sử dụng tệp) không?


14

Giả sử có 2 tác vụ t1, t2có thể được thực hiện theo cách nối tiếp như sau:

t1 ; t2
# OR
t1 && t2

Bây giờ giả sử tôi quên chạy t2t1đã chạy; Tôi có thể thêm t2vào đường ống để nó được thực hiện sau khi t1kết thúc không?

Câu trả lời:


19

Có bạn có thể:

  1. Tạm dừng công việc hiện đang chạy với ký tự tạm dừng bằng cách nhấn Ctrl+ Z.
  2. Nhập fghoặc %, thêm những gì bạn muốn vào danh sách và thực hiện nó, ví dụ:
    fg ; systemctl suspend # or
    % ; systemctl suspend
    fgtrả về giá trị trả về của công việc mà nó đã tiếp tục, liệt kê các toán tử thích &&||làm việc như mong đợi:
    fg && echo "Finished successfully!" # or
    % && echo "Finished successfully!"

man bash/ KIỂM SOÁT CÔNG VIỆC nói về nhân vật bị đình chỉ:

Nhập ký tự treo (thông thường ^Z, Control- Z) trong khi một tiến trình đang chạy khiến quá trình đó bị dừng và trả lại quyền điều khiển bash. (...) Người dùng có thể thao tác sau đó tình trạng của công việc này, bằng cách sử dụng bglệnh để tiếp tục nó ở chế độ nền, các fg lệnh tiếp tục nó ở mặt trước, hoặc các killlệnh để giết nó. A ^Zcó hiệu lực ngay lập tức và có tác dụng phụ bổ sung là làm cho đầu ra và kiểu chữ đang chờ xử lý bị loại bỏ.

fgđược giải thích trong man bash/ SHELL BUILTIN THÔNG TIN :

fg [ jobspec ]
Tiếp tục jobspec ở nền trước và biến nó thành công việc hiện tại. Nếu jobspec không có mặt, khái niệm shell của công việc hiện tại được sử dụng. Giá trị trả về là của lệnh được đặt vào nền trước hoặc thất bại nếu chạy khi điều khiển công việc bị vô hiệu hóa hoặc khi chạy với điều khiển công việc được bật, nếu jobspec không chỉ định một công việc hợp lệ hoặc jobspec chỉ định một công việc được bắt đầu mà không có kiểm soát công việc .

Đọc thêm (ngoài man bash) về kiểm soát công việc:


1 nhưng đó là một sự xấu hổ này không hoạt động khi bạn quên t3trong t1; t2; t3hoặc t1 && t2 && t3.
JoL

@JoL Đúng như vậy - ^Z^Z%-;%+;t3đủ tốt trong một số trường hợp, nhưng nó không phải là một giải pháp thực sự cho vấn đề.
tráng miệng

2

Tôi đã thấy phương pháp này tại đây: /superuser/334272/how-to-run-a-command-after-an-alpered-rucky-ex hiện-one-fineses

nơi đầu tiên bạn làm Ctrl+ zđể dừng (tạm dừng) lệnh đang chạy sau đó bạn chạy lệnh bị bỏ lỡ như vậy: fg && ./missed_cmd.shvà nó sẽ chạy ngay khi fgkết thúc.

Các fg(foreground lệnh) sẽ mang lại công việc bị đình chỉ trực tuyến và &&sẽ đảm bảo rằng các lệnh bỏ lỡ chỉ chạy nếu lệnh đầu tiên thành công.

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.