Ý nghĩa của thoát 0, thoát 1 và thoát 2 trong tập lệnh bash


49

Tôi đang làm một số bài tập thực hành.

Viết một kịch bản sẽ được đưa ra một số tháng làm đối số và sẽ dịch số này thành tên tháng. Kết quả sẽ được in ra thiết bị xuất chuẩn.

Tôi đã thực hiện một giải pháp:

#test for number of argument

if [ "$#" -eq 0 ] ; 
then
   echo -e "No argument."
   echo -e "Write a number between 1 and 12."
   exit 1
elif [ "$#" -gt 1 ] ;
then
   echo -e "More than 1 argument."
   echo -e "Write a number between 1 and 12."
   exit 1
else

   numb=$1
   case "$numb" in
      1) echo "Month: January";;
      2) echo "Month: February";;
      3) echo "Month: March";;
      4) echo "Month: April";;
      5) echo "Month: May";;
      6) echo "Month: June";;
      7) echo "Month: July";;
      8) echo "Month: August";;
      9) echo "Month: September";;
     10) echo "Month: October";;
     11) echo "Month: November";;
     12) echo "Month: December";;
      *) echo -e "You wrote a wrong number. Try again with writing number between 1 and 12.";;

   esac
fi
exit 2
exit 0

Những gì exit 1, exit 0exit 2có nghĩa là gì, và tại sao chúng ta sử dụng chúng?


5
Mã được thực thi thành công sẽ thoát với mã 0. Các giá trị khác biểu thị lỗi. Xem ví dụ Mã thoát với ý nghĩa đặc biệt
V. Olsen

2
Một kịch bản bash giống như một rạp chiếu phim, có tồn tại khác nhau. Các câu lệnh thoát đánh dấu vị trí của lối thoát cho trình thông dịch bash. Khi tập lệnh được kích hoạt, trình thông dịch được yêu cầu chạy cho đến khi thoát gần nhất.
DepressionDaniel

5
Nếu đây là mã bạn đã viết, tại sao bạn lại sử dụng các câu mà bạn thậm chí không hiểu?
Dmitry Grigoryev

5
1) Bạn đã chấp nhận một câu trả lời ngay sau khi đăng câu hỏi. Cho nó 24 giờ để chờ câu trả lời thậm chí tốt hơn. 2) Câu trả lời được chấp nhận là sai và sai. Câu trả lời đúng là "không có ý nghĩa mặc định cho các mã thoát (ngoài 0 = thành công); bạn là nhà phát triển tập lệnh xác định ngữ nghĩa". 3) Nếu bạn đã tạo tập lệnh đó, tại sao bạn lại thêm các lệnh thoát (tất cả chúng đều không hợp lý hoặc có thể thu gọn thành "thoát 1" vì dù sao bạn cũng sử dụng if-other).
AnoE

Câu trả lời:


58

Đây là một tài liệu tham khảo tốt cho mã thoát vỏ :

Exit code 0        Success
Exit code 1        General errors, Miscellaneous errors, such as "divide by zero" and other impermissible operations
Exit code 2        Misuse of shell builtins (according to Bash documentation)        Example: empty_function() {}

Hãy cẩn thận: Sử dụng mã thoát thích hợp không phải là một yêu cầu và không được thực thi bởi trình bao. Các nhà phát triển có thể bỏ qua hướng dẫn nếu họ nghĩ nó khôn ngoan.


8
Hãy cẩn thận, mặc dù. Những gì một mã thoát có nghĩa là hoàn toàn phụ thuộc vào các nhà phát triển của chương trình.
muru

Ngoài ra, trong khi nguồn được liên kết, Hướng dẫn lập trình Bash nâng cao, tuyên bố sẽ hiển thị " Mã thoát dự trữ " (nhấn mạnh trong nguyên bản), yêu cầu đó là cả không được chú ý và hoàn toàn sai .
Eliah Kagan

23

Sử dụng exitvà một số là một cách hữu hiệu để báo hiệu kết quả của tập lệnh của bạn. Nó bắt chước cách các lệnh bash tạo ra mã trả về. Với các lệnh bash, mã trả về 0 thường có nghĩa là mọi thứ được thực hiện thành công mà không có lỗi. exitcũng làm cho tập lệnh của bạn dừng thực thi tại điểm đó và quay lại dòng lệnh.

Bất kỳ mã trả về nào lớn hơn 0 chỉ ra một lỗi nào đó, mặc dù đôi khi lỗi không nghiêm trọng, đối với mỗi lệnh, có thể tìm thấy một số tài liệu cho bạn biết mỗi mã trả về nghĩa là gì.

Bạn có thể lấy mã trả về của lệnh bash cuối cùng bằng cách sử dụng biến shell $?như vậy:

$ echo "something"
something
$ echo $?
0
$ cp
cp: missing file operand
Try 'cp --help' for more information.
$ echo $?
1

Khi bạn sử dụng điều này trong một tập lệnh, bạn có thể truy vấn mã trả về theo cách tương tự khi thực hiện xong. Vì vậy, bạn sẽ thấy rằng có:

exit 2
exit 0

Là loại vô nghĩa, vì bạn không bao giờ có thể đạt được exit 0một phần.


3

Tự nó, exitngụ ý giá trị thoát bằng 0 hoặc hoàn thành thành công tập lệnh của bạn. Bạn không phải thêm đối số 0 vào lệnh exit để chỉ ra việc hoàn thành thành công. Kịch bản của bạn có thể (hoặc có thể sẽ) thoát thành công mặc dù nó kiểm tra một điều kiện sai. Trong trường hợp này, bạn đặc biệt muốn nó thoát với điều kiện lỗi (hoặc 1).

echo -e "Enter numbers 1-4" \c"
read NUM
case $NUM in 
    1) echo "one";;
    2) echo "two";;
    3) echo "three";;
    4) echo "four";;
    *) echo "invalid answer"
       exit 1;;
esac

Các exitlệnh trong dòng cuối cùng không phải ở đó cả. Nó có thể được gọi bằng 0 hoặc không được gọi. Nếu không chỉ định đối số 1 cho lệnh exit, câu trả lời trong tất cả các trường hợp echo $?này sẽ là 0.

Tuy nhiên, bằng cách chỉ định đối số 1 cho lệnh thoát, phản hồi cho echo $?sẽ là 1. Vì vậy, hãy sử dụng đối số 1 cho lệnh thoát khi bạn muốn xác định rằng tập lệnh đã thoát với điều kiện lỗi.

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.