Làm cách nào để xâu chuỗi các lệnh trên bàn điều khiển?


23

Trong bash, đôi khi tôi muốn chạy một số lệnh nối tiếp và không muốn đợi chúng hoàn thành trước khi tôi gõ những lệnh mới. Vì vậy, tôi làm một cái gì đó như thế này:

cmd1; cmd2; cmd3

Thật không may, một trong những lệnh có thể thất bại. Trong trường hợp đó, tôi muốn dừng lại. Có một cách dễ dàng để làm điều này, nhưng làm cho nó để tôi chỉ tiếp tục chạy các lệnh nếu lệnh trước đó có mã thoát 0?


Đây là một câu trả lời tuyệt vời từ Unix SE.
Phi tuyến

Câu trả lời:


39

Sử dụng &&toán tử,

cmd1 && cmd2 && cmd3

Trong shellscripting, &&và các ||toán tử được mô hình hóa sau khi thực hiện tối ưu hóa các toán tử logic trong C. &&có nghĩa là toán tử AND và ||có nghĩa là OR. Unix có liên quan chặt chẽ với C và trong C, toán hạng thứ hai của toán tử logic không được đánh giá nếu kết quả đã được biết từ toán hạng thứ nhất. Ví dụ "false && x"falsecho bất kỳ x, vì vậy không cần phải đánh giá x(đặc biệt nếu xlà một lệnh gọi hàm); tương tự cho "true || x". Điều này cũng được gọi là ngữ nghĩa ngắn mạch .

Và trong Unix, theo cách truyền thống là diễn giải các giá trị trả về của lệnh là giá trị thật "hoàn thành thành công": mã thoát 0 có nghĩa là true(thành công), không khác nghĩa false(thất bại). Vì vậy, khi lệnh đầu tiên cmd1 && cmd2trả về "false"(trạng thái thoát không khác, biểu thị sự thất bại), trạng thái của lệnh ghép được biết: thất bại. Vì vậy, giải thích tổng cmd1 && cmd2 thể có thể là: "thực thi cmd1, VÀ THÌ, nếu nó không thất bại cmd2". Đó là những gì bạn về cơ bản muốn trong câu hỏi của bạn.

Tương tự với OR: cmd1 || cmd2có thể được hiểu là "thực thi cmd1, HOẶC NẾU thất bại cmd2".


Protip: đối với chuỗi dài hơn &&, hãy xem xét đưa set -evào tập lệnh của bạn. Về cơ bản, nó thay đổi dấu chấm phẩy ;thành &&một vài trường hợp đặc biệt.


1
+1 để giải thích||
Alp

bạn có thể xâu chuỗi trạng thái của lệnh đầu tiên không? (thành công hay thất bại)
Hugo Trentesaux

@HugoTrentesaux những gì bạn nghĩa là gì? .. Sự thành công / thất bại kết quả hay A || Bchỉ là giống như [ngắn circuiting] logic A HOẶC B . A || Bthành công khi Ađã thành công , hoặc khi Ađã thất bại nhưng Bđã thành công ; và A || Bthất bại khi Ađã thất bạiBđã failure. Tương tự như vậy &&, nó tuân theo logic VÀ.
ulidtko

Trong bối cảnh shell, làm thế nào tôi có thể thực thi A và sau đó B bất kể A thất bại hay thành công?
Hugo Trentesaux

1
@HugoTrentesaux đó là những gì thông thường ;(hoặc dòng mới) làm theo mặc định. set -esẽ biến ;thành &&, đại khái nói. set +e[mặc định] biến A; Bthành những gì bạn nói: chạy A, sau đó không quan trọng chạy gì B.
ulidtko

13

"Chaining Lệnh một nhóm chúng"

ping 192.168.0.1 || { echo "ping not successful"; exit 1; }

ping, chỉ khi không thành công, sẽ thực thi nhóm các chuỗi lệnh trong ngoặc.

Chú ý:

Danh sách phải được chấm dứt bằng dấu ";".

Phải có khoảng trắng giữa dấu ngoặc và các lệnh được nhóm!


6

Đơn giản với &&nhà điều hành. Ví dụ:

cmd1 && cmd2 && cmd3

Nếu một trong các lệnh không thành công (trả về giá trị thoát khác 0), các lệnh khác sẽ không chạy.

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.