Tôi có thể bằng cách nào đó thêm một ứng dụng && prog2 vào một prog1 đang chạy không?


87

Hầu hết các shell cung cấp các hàm như &&;để chuỗi thực thi các lệnh theo những cách nhất định. Nhưng nếu một lệnh đang chạy, tôi vẫn có thể thêm một lệnh khác để thực thi tùy thuộc vào kết quả của lệnh đầu tiên?

Nói rằng tôi đã chạy

$ /bin/myprog
some output...

nhưng tôi thực sự muốn /bin/myprog && /usr/bin/mycleanup. Tôi không thể giết myprogvà khởi động lại mọi thứ vì mất quá nhiều thời gian. Tôi có thể Ctrl+ Znó và fg/ bgnếu cần thiết. Điều này có cho phép tôi xâu chuỗi trong một lệnh khác không?

Tôi chủ yếu quan tâm đến bash, nhưng câu trả lời cho tất cả các shell thông thường đều được chào đón!

Câu trả lời:


118

Bạn sẽ có thể thực hiện việc này trong cùng trình bao với waitlệnh:

$ sleep 30 &
[1] 17440

$ wait 17440 && echo hi

...30 seconds later...
[1]+  Done                    sleep 30
hi

đoạn trích từ trang Bash Bash

wait [n ...]
     Wait for each specified process and return its termination status. Each n 
     may be a process ID or a job specification; if a job spec is given,  all 
     processes  in that job's pipeline are waited for.  If n is not given, all 
     currently active child processes are waited for, and the return status is 
     zero.  If n specifies a non-existent process or job, the return status is 
     127.  Otherwise, the return status is the exit status of the last process 
     or job waited for.

Chờ lệnh nên làm công việc.
BillThor

Có một số hình thức ngắn để nhập vào PID của quá trình nền, chẳng hạn như %, %1$!. Điều quan trọng là cung cấp cho PID hoặc lệnh thứ hai sẽ luôn chạy.
BillThor

@BillThor - bạn chỉ đủ điều kiện trả lời hoặc cho tôi biết điều này?
slm

Tôi đủ điều kiện trả lời. Một đồng bằng waitsẽ không cung cấp kết quả mong muốn. Người ta thường sử dụng các hình thức ngắn vì chúng ít bị lỗi chính tả.
BillThor

2
Hãy để tôi là người đầu tiên chúc mừng bạn với huy hiệu mới sáng bóng của bạn :)
terdon

63

fgtrả về với mã thoát khỏi chương trình mà nó tiếp tục. Do đó, bạn có thể tạm dừng chương trình của mình ^Zvà sau đó sử dụng fg && ...để tiếp tục chương trình.

$ /bin/myprog
some output...
^Z
[1]+ Stopped              /bin/myprog
$ fg && /usr/bin/mycleanup

nếu bạn tạm dừng một lần nữa trước khi nó kết thúc và thực hiện điều tương tự với một lệnh khác, liệu chuỗi kết nối ban đầu của mycleanup có bị thay thế không?
Burhan Ali

3
@BurhanAli Tạm dừng myproglần thứ hai khiến fgchấm dứt với mã thoát 20 - không phải là số không, vì vậy mycleanuplệnh bị xiềng xích không được thực thi.
n.st

1

Không chắc chắn nếu những gì bạn yêu cầu là có thể, nhưng nếu bạn vẫn có trình bao bạn đã khởi động chương trình từ đó, bạn luôn có thể kiểm tra $?trạng thái thoát của quy trình cuối cùng:

$ /bin/myprog
some output...
$ if [ $? -ne 0 ];then echo "non-zero exit status";else echo "0 exit status";fi

1
Điều này sẽ hoạt động, nhưng anh ta sẽ phải chạy thủ công sau đó, anh ta muốn chạy nó tự động khi lệnh kết thúc.
slm

@slm Đồng ý. Tôi không có giải pháp cho vấn đề chính xác đó.
Joseph R.

3
Kiểm tra waitlệnh trong Bash.
slm

1

Nếu công việc ở phía trước, một trong hai lệnh này sẽ có hành vi giống như bạn mong đợi.

[ $? -eq 0 ] && prog2
(( $? )) || prog2

LƯU Ý: $? sẽ chứa trạng thái trả về của chương trình đang chạy khi thoát.

Điều này được nêu rõ ràng những gì shell sẽ làm nếu bạn đã nhập lệnh ban đầu.

prog1 && prog2

Nếu lệnh đầu tiên không đọc từ stdinvà đang chạy ở nền trước, lệnh mới có thể được nhập trong khi lệnh đầu tiên đang chạy. Shell sẽ đọc và thực thi nó khi lệnh đầu tiên thực thi. Nếu lệnh sẽ chạy trong nền, không chắc là nó đang đọc stdin.

EDIT: Đặt công việc trong nền và sử dụng WAITlệnh cũng có thể được sử dụng. Điều này phải được thực hiện cẩn thận nếu các công việc khác cũng đã được chạy trong nền. Một đặc tả công việc được yêu cầu để có WAITlệnh trả về trạng thái của công việc đang chờ.


Điều này sẽ hoạt động, nhưng anh ta sẽ phải chạy thủ công sau đó, anh ta muốn chạy nó tự động khi lệnh kết thúc.
slm

4
@slm Miễn là lệnh không đọc stdin, lệnh mới có thể được nhập trong khi lệnh đầu tiên đang chạy. Shell sẽ đọc nó ngay khi lệnh đầu tiên được thực hiện.
BillThor

Nếu anh ta làm bất cứ điều gì trong vỏ sau khi nó được làm nền, nó có khả năng bị ho. Ít nhất là theo sơ bộ. thử nghiệm tôi đã làm cho đến nay!
slm

2
@BillThor Tôi nghĩ bạn nên thêm nhận xét đó vào câu trả lời của mình.
Joseph R.

2
Có, sử dụng waitcũng không lý tưởng. Ưu điểm, IMO, là nó mang lại cho chúng ta một API rõ ràng hơn mà chúng ta đang xử lý. Nhập thêm các lệnh trên dòng lệnh sau khi một cái gì đó đang chạy có vẻ hơi khó khăn với tôi. waitvẫn không nhận được một liên kết trực tiếp đến bộ vi xử lý đang chạy, ghi lại trạng thái trả về. Đây dường như là một vấn đề nhiều hơn với cách Bash thực hiện mọi thứ mặc dù: stackoverflow.com/questions/356100/ mẹo . Vì vậy, điều này có thể là tốt như nó được.
slm
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.