Cách gửi nhiều lệnh tới shell và đợi lệnh phía sau kết thúc [đã đóng]


16

Tôi có khoảng 20 lệnh và tôi phải gửi tất cả các lệnh này đến Unix shell và sao chép kết quả, nhưng tôi không biết làm thế nào để thực hiện nó.

Tôi không chắc chắn về vỏ của mình, vì đây là một chương trình nhỏ được kết nối với Quản lý mạng di động và với chương trình nhỏ này, chúng tôi có quyền truy cập để gửi lệnh theo dòng và đọc kết quả bằng cách hét lên, vì lý do đó tôi không thể sử dụng tập lệnh cho gửi các lệnh.

Lệnh 1 - Kết nối với máy chủ.

Đợi cho đến khi lệnh 1 kết thúc

Lệnh 2 - Cập nhật tất cả thông tin từ máy chủ 1 kết thúc

Chờ đợi.

Lệnh 3 . Lấy một số tham số.

... và nhiều lệnh như vậy.

Tôi đã thử với cmd1 | cmd2 | cmd3 cmd1 & cmd2 & cmd3cmd1;cmd2

Vấn đề là do cmd1nó được kết nối với RNC (Phần tử mạng) và mất 15 giây, sau đó cmd2có ý nghĩa. nhưng chỉ làm việc cho cmd đầu tiên. Bất kỳ manh mối, làm thế nào để chạy này?


3
Sử dụng một kịch bản? Hoặc &&giữa các lệnh.
Bernhard

Câu trả lời:


20

Thông thường chỉ cmd1;cmd2;cmd3;cmd4(nếu bạn muốn viết nó trên một dòng) hoặc sử dụng cmd1 && cmd2 && cmd3 && cmd4nếu bạn không muốn chạy cmd3 khi cmd2 không thành công.

Ngoài ra, ;bạn chỉ có thể viết một lệnh trên mỗi dòng.

cmd1
cmd2
cmd3
cmd4

Nếu bạn muốn các lệnh chạy song song trong nền, bạn cũng có thể sử dụng

cmd1 &
cmd2 &
cmd3 &
cmd4 &
wait # for cmd1-4 to finish

Một trong những phương thức đó cũng có thể được đặt trong một tập lệnh shell. Có rất ít sự khác biệt giữa những gì bạn viết trong một kịch bản shell và những gì bạn viết trong chính shell thực tế.


MM là vấn đề của nó khi tôi gửi cmd1, nó thực sự phải hoàn thành trong khoảng 6 giây, vấn đề là khi nó gửi cmd2cmd1 thì nó vẫn không thành công.
Jonathan Raul Tapia Lopez

4
Trong cmd1;cmd2trường hợp (hoặc cmd1 && cmd2cho vấn đề đó) cmd2 sẽ không chạy cho đến khi cmd1 thoát (và do đó có lẽ đã kết thúc). Vì vậy, không nên có bất kỳ vấn đề nào - vui lòng viết lại câu hỏi của bạn hoặc cung cấp một ví dụ mà mọi người thực sự có thể sao chép.
frostschutz

Ok tôi sẽ sửa đổi câu hỏi. cảm ơn
Jonathan Raul Tapia Lopez

2

Bạn có thể muốn xem xét sleep, nếu môi trường của bạn cho phép nó. Trình tự hoàn chỉnh sau đó sẽ là một cái gì đó như cmd1 && sleep 10s && cmd2.
Đây là trang người đàn ông có liên quan cho giấc ngủ .


ngủ / chờ chỉ hữu ích nếu bạn xác định chắc chắn chương trình trước đó (có thể sinh ra quá trình nền) mất bao lâu để kết thúc và thoát (IE Vấn đề dừng) HOẶC nếu bạn đảm bảo rằng bạn muốn ngắt và chạy lệnh thứ hai sau khoảng thời gian đã qua, điều này có thể xảy ra nếu cả hai không đồng bộ nhưng bạn vẫn muốn một lúc nào đó ở giữa chúng. Nhiều khả năng mặc dù, nó không phải là những gì bạn muốn. Thực tế mà nói, nó có thể hoạt động. Nhưng nó không đáng tin cậy.
Justin Reeves

1

Chỉ cần sử dụng một tập lệnh, một tập tin chứa các lệnh để chạy từng cái một, như:

#!/bin/sh

command-01
command-02
...
command-20

Dòng đầu tiên (shebang) bảo chạy các lệnh sau bằng cách sử dụng /bin/sh, làm cho tệp thực thi ( chmod u+x your-little-script) sau đó bạn có thể chạy nó bằng cách ./my-little-script. Bằng cách này, bạn sẽ không rời khỏi một số bước ra ;-)

Đọc hướng dẫn cho shell, nó cung cấp một ngôn ngữ lập trình đầy đủ. Kiểm tra bash(1)nếu đó là những gì có sẵn, hoặc nếu không thì vỏ Korn ksh(1). Họ cung cấp rất nhiều tính năng hữu ích để kiểm soát luồng điều khiển trong các tập lệnh (hoặc tương tác, cho vấn đề đó).


Cảm ơn nhưng tôi không thể sử dụng scritps.
Jonathan Raul Tapia Lopez

Tại sao? Trong mọi trường hợp, trừ khi đây là một môi trường rất phát xít, bạn sẽ có thể tìm nguồn kịch bản: source your-little-script(hoặc . your-little-scriptviết tắt).
vonbrand

Vì tôi không truy cập trực tiếp vào hệ thống unix mà tôi có một chương trình nhỏ, chỉ cho phép thực thi cmd trong các dòng và nhận được kết quả bằng cách hét lên, và để sử dụng Im sẽ sử dụng lệnh này không thực tế để sử dụng các đoạn mã.
Jonathan Raul Tapia Lopez

OK, điều đó làm rõ mọi thứ một chút ... Môi trường nào là nguồn gốc / đích của các lệnh của bạn? Những gì bạn sử dụng để gửi lệnh để được thực hiện? Môi trường từ xa là gì? Thiết lập của bạn ở đó là gì (bạn có tài khoản thông thường mà bạn có thể truy cập qua sshhoặc PuTTYcó lẽ không?
vonbrand

-1

Bạn có thể chạy một cái gì đó như expecttrên máy tính cục bộ của mình để gửi cmd1và đợi nó kết thúc trước khi phát hành, cmd2v.v. Bạn phải tìm ra một khoảng thời gian hợp lý để chờ đợi, hoặc một đầu ra cụ thể chỉ ra rằng lệnh đã được thực hiện, để viết một lệnh thích hợp Kịch bản mong đợi.

Tất nhiên, cmd1; cmd2; cmd3; cmd4trong một lệnh sẽ thực hiện các lệnh theo thứ tự, lần lượt từng lệnh khác.

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.