Câu trả lời:
Không có "công thức" để có được ý nghĩa của trạng thái thoát của lệnh đầu cuối đã cho.
Nỗ lực đầu tiên của tôi sẽ là trang chủ:
user@host:~# man ls
Exit status:
0 if OK,
1 if minor problems (e.g., cannot access subdirectory),
2 if serious trouble (e.g., cannot access command-line argument).
Thứ hai : Google . Xem wget là một ví dụ.
Thứ ba : Các trạng thái thoát của shell, ví dụ bash. Bash và nó được xây dựng có thể sử dụng các giá trị trên 125 đặc biệt. 127 cho lệnh không tìm thấy, 126 cho lệnh không thực thi. Để biết thêm thông tin, xem mã thoát bash .
Mã thoát cho biết tình trạng lỗi khi kết thúc chương trình và chúng nằm trong khoảng từ 0 đến 255. Shell và các phần tử của nó có thể sử dụng đặc biệt là các giá trị trên 125 để chỉ ra các chế độ lỗi cụ thể, vì vậy danh sách mã có thể khác nhau giữa các shell và hệ điều hành (ví dụ Bash sử dụng giá trị 128 + N làm trạng thái thoát). Xem: Bash - 3.7.5 Trạng thái thoát hoặc man bash
.
Nói chung, trạng thái thoát không cho biết lệnh đã thành công , trạng thái thoát khác không cho biết lỗi .
Để kiểm tra mã lỗi nào được trả về bởi lệnh, bạn có thể in $?
mã thoát cuối cùng hoặc ${PIPESTATUS[@]}
đưa ra danh sách các giá trị trạng thái thoát khỏi đường ống (trong Bash) sau khi thoát khỏi tập lệnh shell.
Không có danh sách đầy đủ tất cả các mã thoát có thể được tìm thấy, tuy nhiên đã có một nỗ lực hệ thống hóa các số trạng thái thoát trong nguồn kernel, nhưng đây là mục đích chính cho các lập trình viên C / C ++ và tiêu chuẩn tương tự cho kịch bản có thể phù hợp.
Một số danh sách sysexits trên cả Linux và BSD / OS X với mã thoát thích hợp hơn cho các chương trình (64-78) có thể được tìm thấy trong /usr/include/sysexits.h
(hoặc: man sysexits
trên BSD):
0 /* successful termination */
64 /* base value for error messages */
64 /* command line usage error */
65 /* data format error */
66 /* cannot open input */
67 /* addressee unknown */
68 /* host name unknown */
69 /* service unavailable */
70 /* internal software error */
71 /* system error (e.g., can't fork) */
72 /* critical OS file missing */
73 /* can't create (user) output file */
74 /* input/output error */
75 /* temp failure; user is invited to retry */
76 /* remote error in protocol */
77 /* permission denied */
78 /* configuration error */
/* maximum listed value */
Danh sách trên phân bổ các mã thoát chưa sử dụng trước đó từ 64-78. Phạm vi của các mã thoát chưa được phát hiện sẽ bị hạn chế hơn nữa trong tương lai.
Tuy nhiên, các giá trị trên chủ yếu được sử dụng trong sendmail và được sử dụng bởi khá nhiều người khác, vì vậy chúng không phải là bất cứ thứ gì từ xa gần với một tiêu chuẩn (như được chỉ ra bởi @Gilles ).
Trong shell, trạng thái thoát như sau (dựa trên Bash):
1
- 125
- Lệnh không hoàn thành thành công. Kiểm tra trang man của lệnh để biết ý nghĩa của trạng thái, một vài ví dụ dưới đây:
1
- Catchall cho các lỗi chung
Các lỗi khác, chẳng hạn như "chia cho số 0" và các hoạt động không thể chấp nhận khác.
Thí dụ:
$ let "var1 = 1/0"; echo $?
-bash: let: var1 = 1/0: division by 0 (error token is "0")
1
2
- Sử dụng sai các nội dung shell (theo tài liệu của Bash)
Thiếu từ khóa hoặc lệnh hoặc vấn đề cấp phép (và mã trả về diff khi so sánh tệp nhị phân không thành công).
Thí dụ:
empty_function() {}
6
- Không có thiết bị hoặc địa chỉ như vậy
Thí dụ:
$ curl foo; echo $?
curl: (6) Could not resolve host: foo
6
124
- hết thời gian
125
- nếu một lệnh tự thất bại, xem: coreutils126
- nếu lệnh được tìm thấy nhưng không thể được gọi (ví dụ: không thể thực thi)
Vấn đề quyền hoặc lệnh không phải là một thực thi.
Thí dụ:
$ /dev/null
$ /etc/hosts; echo $?
-bash: /etc/hosts: Permission denied
126
127
- nếu một lệnh không thể được tìm thấy, tiến trình con được tạo để thực thi nó sẽ trả về trạng thái đó
Vấn đề có thể xảy ra với
$PATH
hoặc một lỗi đánh máy.
Thí dụ:
$ foo; echo $?
-bash: foo: command not found
127
128
- Đối số không hợp lệ để exit
exit chỉ lấy số nguyên arg trong phạm vi 0 - 255.
Thí dụ:
$ exit 3.14159
-bash: exit: 3.14159: numeric argument required
128
- 254
- tín hiệu lỗi nghiêm trọng "n" - lệnh bị chết do nhận tín hiệu. Mã tín hiệu được thêm vào 128 (128 + TÍN HIỆU) để có trạng thái (Linux : man 7 signal
, BSD man signal
:), một vài ví dụ dưới đây:
130
- lệnh bị chấm dứt do nhấn Ctrl-C, 130-128 = 2 (SIGINT)
Thí dụ:
$ cat
^C
$ echo $?
130
137
- nếu lệnh được gửi KILL(9)
tín hiệu (128 + 9), trạng thái thoát lệnh khác
kill -9 $PPID
của kịch bản.
141
- SIGPIPE
- viết trên một đường ống không có người đọc
Thí dụ:
$ hexdump -n100000 /dev/urandom | tee &>/dev/null >(cat > file1.txt) >(cat > file2.txt) >(cat > file3.txt) >(cat > file4.txt) >(cat > file5.txt)
$ find . -name '*.txt' -print0 | xargs -r0 cat | tee &>/dev/null >(head /dev/stdin > head.out) >(tail /dev/stdin > tail.out)
xargs: cat: terminated by signal 13
$ echo ${PIPESTATUS[@]}
0 125 141
143
- lệnh kết thúc bằng mã tín hiệu 15 (128 + 15 = 143)
Thí dụ:
$ sleep 5 && killall sleep &
[1] 19891
$ sleep 100; echo $?
Terminated: 15
143
255
* - trạng thái thoát khỏi phạm vi.
exit chỉ lấy số nguyên arg trong phạm vi 0 - 255.
Thí dụ:
$ sh -c 'exit 3.14159'; echo $?
sh: line 0: exit: 3.14159: numeric argument required
255
Theo bảng trên, mã thoát 1 - 2, 126 - 165 và 255 có ý nghĩa đặc biệt và do đó nên tránh các tham số thoát do người dùng chỉ định.
Xin lưu ý rằng giá trị thoát khỏi phạm vi có thể dẫn đến mã thoát không mong muốn (ví dụ: lối ra 3809 cung cấp mã thoát là 225, 3809% 256 = 225).
Xem:
errno
các giá trị được sử dụng bởi các API hệ thống, chúng không được sử dụng làm trạng thái thoát (thậm chí chúng không nằm trong phạm vi phù hợp) và chúng không liên quan đến kịch bản shell. Giá trị Sysexits là từ sendmail và được sử dụng bởi khá nhiều người khác, chúng không phải là bất cứ thứ gì từ xa gần với một tiêu chuẩn.
Bạn sẽ phải xem xét mã / tài liệu. Tuy nhiên, điều gần nhất với "tiêu chuẩn hóa" là errno.h
errno.h
không liên quan khi nói đến mã thoát, chỉ có thông báo lỗi.
sysexits.h
. Tuy nhiên, một số chương trình trả về errno
s và tôi thực sự nghĩ rằng trả về errno
s có ý nghĩa nhất. Không được xử lý errno
truyền lên trên, như các trường hợp ngoại lệ, ( errno
ở lại, các hàm trả về, ví dụ, -1
hoặc 0|NULL
). Vì các chương trình chỉ là các hàm, mặc dù các hàm được chạy trong một không gian địa chỉ riêng biệt, nên có nghĩa là một chương trình có thể muốn tiếp tục errno
truyền bá qua ranh giới quá trình.
"($numeric_code|$bsd_decoded|$errno_plus_one_decoded)"
.
Theo như tôi biết, chỉ có hai, nhiều hơn hoặc ít hơn, các giá trị tiêu chuẩn - cả hai đều được xác định stdlib.h
để sử dụng với exit ():
Và giá trị tiêu chuẩn thực tế duy nhất, nghĩa là có cùng ý nghĩa đối với tất cả các chương trình trên thế giới, là 0 (không) là viết tắt của THÀNH CÔNG.
Các chương trình khác nhau giới thiệu các danh sách khác nhau về các mã "thất bại" được trả về để phân biệt hoặc nhấn mạnh các lỗi khác nhau (các loại hoặc mức độ nghiêm trọng khác nhau). Một số chương trình thậm chí sử dụng giá trị được trả về để báo cáo số nguyên lỗi thời gian chạy được phát hiện (ví dụ: số lần kiểm tra đơn vị không thành công trong vụ kiện).
Tôi không khuyên bạn nên giới thiệu bất kỳ loại "tiêu chuẩn mới" nào mở rộng stdlib.h