Thoát mã ở cuối tập lệnh bash


22

Tôi bối rối về ý nghĩa của mã thoát ở cuối tập lệnh bash: Tôi biết rằng mã thoát 0 có nghĩa là nó đã kết thúc thành công và có nhiều số mã thoát hơn (127 nếu tôi không nhầm?)

Câu hỏi của tôi là về việc nhìn thấy mã thoát 0 ở cuối tập lệnh, nó có buộc mã thoát là 0 ngay cả khi tập lệnh thất bại hay nó có ý nghĩa khác không?


2
Nếu một tập lệnh kết thúc exit 0, nó sẽ thoát với mã thoát là 0 bất kể điều gì xảy ra trong tập lệnh.
Hatclock

@Hatclock tại sao bạn không đăng câu trả lời của bạn một câu trả lời đầy đủ cam kết? như một bình luận tôi không thể đánh dấu nó, và tôi không nghĩ rằng bạn nhận được điểm giả internet để trả lời Chỉ cần một ý nghĩ ... (thanh danh cho câu trả lời nhanh) (phải không?)
Busted

1
Tôi đang ở một nhà ga xe lửa trên điện thoại của mình, tôi thực sự không thích gõ quá nhiều vào điện thoại của mình. ilkkachu dường như có một câu trả lời tốt mặc dù!
Hatclock


2
@Hatclock Không, hoàn toàn không. Nếu một tập lệnh kết thúc exit 0, nó sẽ thoát với mã 0 chỉ khi lệnh cuối cùng được thực thi. Tác động duy nhất của exit 0phần cuối của tập lệnh là trả về 0 thay vì trạng thái từ hướng dẫn trước đó.
Gilles 'SO- ngừng trở nên xấu xa'

Câu trả lời:


22

Lệnh dựng sẵn exitthoát khỏi trình bao (từ tham chiếu của Bash ):

exit [n]
Thoát khỏi shell, trả lại trạng thái n cho cha của shell. Nếu n bị bỏ qua, trạng thái thoát là trạng thái của lệnh cuối cùng được thực thi. Bất kỳ bẫy nào trên EXIT đều được thực thi trước khi shell kết thúc.

Chạy đến cuối tệp cũng thoát, trả về mã trả về của lệnh cuối cùng, vì vậy, cuối cùng exit 0sẽ làm cho đoạn mã thoát với trạng thái thành công bất kể trạng thái thoát của các lệnh trước đó. (Nghĩa là, giả sử tập lệnh đi đến cuối cùng exit.) Ở cuối tập lệnh, bạn cũng có thể sử dụng truehoặc :để lấy mã thoát bằng không.

Tất nhiên thường xuyên hơn bạn sẽ sử dụng exittừ bên trong một ifđể kết thúc tập lệnh ở giữa.

Chúng nên in 1 ( $?chứa mã thoát được trả về bởi lệnh trước đó):

sh -c "false" ; echo $?
sh -c "false; exit" ; echo $?

Trong khi điều này sẽ in 0:

sh -c "false; exit 0" ; echo $?

Tôi không chắc liệu khái niệm kịch bản có "thất bại" khi thực hiện một exitý nghĩa hay không, vì một số lệnh được chạy bởi kịch bản sẽ thất bại, nhưng chính kịch bản đã thành công. Tùy thuộc vào tác giả của kịch bản để quyết định đâu là thành công và điều gì không.

Ngoài ra, phạm vi tiêu chuẩn cho mã thoát là 0..255. Các mã trên 127 được sử dụng bởi shell để chỉ ra một quá trình được kết thúc bởi tín hiệu, nhưng chúng có thể được trả về theo cách thông thường. Cuộc waitgọi hệ thống thực sự trả về một giá trị rộng hơn, phần còn lại chứa các bit trạng thái được thiết lập bởi hệ điều hành.


Thật tuyệt, tôi không biết về cách đánh số mã thoát 8 bit. Cảm ơn!
Bained

Lưu ý rằng khi một tiến trình bị giết, nó không thoát với mã thoát> 127. Chỉ là một số shell được đặt $?thành 128 + dấu trong trường hợp đó. Xem Mã thoát mặc định khi quá trình kết thúc? để biết chi tiết.
Stéphane Chazelas

exit 0sẽ chỉ trả về 0, nếu lối ra được thực thi. (nó có thể thoát ra bằng một tuyến đường khác).
ctrl-alt-delor

18

0 có nghĩa là thành công, số nguyên dương có nghĩa là thất bại. Có 255 mã lỗi khác nhau, nhưng các giá trị 126 trở lên được dành riêng để chỉ ra rằng chương trình không thể bắt đầu (126 hoặc 127) hoặc bị giết bởi tín hiệu (129 trở lên). Xem Mã thoát mặc định khi quá trình kết thúc? Tôi có thể sử dụng giá trị trả về / thoát nào trong các hàm / tập lệnh bash? để biết thêm thông tin.

Trạng thái thoát của tập lệnh shell là trạng thái thoát của lệnh cuối cùng mà tập lệnh thực thi. Ví dụ

#!/bin/sh
somecommand

trả về trạng thái thoát của somecommand, trong khi

#!/bin/sh
somecommand
exit 0

trả về 0 bất kể somecommandtrả về cái gì Kịch bản thứ hai này cũng có thể được viết

#!/bin/sh
somecommand
true

Đặt exit 0ở cuối tập lệnh không nhất thiết phải trả về 0. Điều này chỉ làm cho nó trả về 0 khi kết thúc tập lệnh. Ví dụ: tập lệnh sau luôn trả về 3:

#!/bin/sh
exit 3
exit 0

Tập lệnh sau cũng luôn trả về mã lỗi, ngoài việc hiển thị thông báo về lỗi cú pháp:

#!/bin/sh
}
exit 0

Kịch bản sau đây trả về 1 hoặc 0 tùy thuộc vào đối số đầu tiên của nó:

#!/bin/sh
if [ "$1" = "foo" ]; then
  exit 1
fi
exit 0

Tập lệnh sau trả về trạng thái của somecommand, vì set -elàm cho tập lệnh thoát nếu somecommandkhông thành công:

#!/bin/sh
set -e
somecommand
exit 0
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.