Làm cách nào để tra cứu mã thoát cho các ứng dụng?


8

Tôi đang gặp khó khăn trong việc tìm danh sách mã lỗi cập nhật toàn diện từ Bash. ví dụ:

$ udevadm info /dev/sdx; echo Exit code $?
Unknown device, --name=, --path=, or absolute path in /dev/ or /sys expected.
Exit code 4

Làm thế nào một người được cho là tìm kiếm mã thoát như vậy?


1
Cần lưu ý rằng ví dụ của bạn, udevadmkhông một kịch bản bash ...
jasonwryan

1
Nếu một trong những câu trả lời này giải quyết được vấn đề của bạn, vui lòng dành một phút và nhấp vào dấu kiểm bên dưới số phiếu bên trái, điều này sẽ biểu thị cho mọi người rằng vấn đề của bạn đã được giải quyết và là cách cảm ơn được thể hiện trong trang web.
terdon

Câu trả lời:


11

tl; dr Mã thoát là ứng dụng cụ thể.

Có một số quy ước lỏng lẻo. falsevà bất cứ điều gì thành công có tiền tố !(như ! true) trong shell POSIX đều trả về mã thoát 1, nhưng nhà phát triển có thể sử dụng bất kỳ mã thoát nào trong khoảng từ 0 đến 255 cho bất cứ điều gì họ muốn. Cuối cùng, bạn phải xem tài liệu của nó (trong trường hợp tốt nhất) hoặc mã (trong trường hợp xấu nhất) để biết ý nghĩa của nó. Đối với các chương trình có manmã thoát trang thường sẽ được liệt kê trong một phần có tên EXIT STATUS(công cụ GNU như find).

Một số ý nghĩa phổ biến được liệt kê trong /usr/include/sysexits.h- Tôi cố gắng sử dụng chúng bất cứ khi nào có thể. Như @AnsgarEsztermann chỉ ra , đây không phải là tài liệu tham khảo Bash, hay thậm chí là tài liệu tham khảo ứng dụng ngoại trừ những người chọn sử dụng nó (nhà phát triển C / C ++ chủ yếu theo ABS ).


Tôi hiểu rồi. Cảm ơn l0b0 và jasonwryan. Vì vậy, tôi kết luận rằng lệnh cụ thể là tài liệu không đúng.
Dave Rove

2
Trong trường hợp điều này không trở nên rõ ràng từ câu trả lời của l0b0: các mã thoát này không phải là "mã thoát bash". Chúng hoàn toàn thuộc về các lệnh đã thoát và chúng sẽ không thay đổi nếu các lệnh này được gọi theo một cách khác không liên quan đến bash.
Ansgar Esztermann

Các giá trị trong sysexits.hkhá nhiều không được sử dụng ngoại trừ bởi procmailvà công ty. Chỉ sendmail (và một số MTA khác) quan tâm đến chúng.
Gilles 'SO- ngừng trở nên xấu xa'

12

Có một số mã thoát với ý nghĩa đặc biệt dành riêng :

Ý nghĩa mã số thoát
1 Catchall cho các lỗi chung
2 Lạm dụng các nội dung shell (theo tài liệu của Bash)
Lệnh được gọi không thể thực thi
127 "lệnh không tìm thấy"
128 + n Tín hiệu lỗi nghiêm trọng "n"
130 Script bị chấm dứt bởi Ctrl-C
255 * Thoát trạng thái ra khỏi phạm vi

Mọi thứ dưới 125 là trò chơi công bằng cho các nhà phát triển và thực sự chỉ có thể được đoán, như l0b0 ghi chú trong câu trả lời của anh ấy , bằng cách đọc mantrang cho ứng dụng hoặc mã nguồn, để xác định mã nào biểu thị (nếu, thực sự, nó được ghi lại ở tất cả).


2
Cũng cần lưu ý rằng những thứ này chỉ được "dành riêng" theo quy ước - không có sự thực thi nào (ngoài ý nghĩa tốt) thực sự ngăn chặn, ví dụ, một ứng dụng sử dụng 1hoặc 2có nghĩa success. Tất cả mọi thứ thực sự là trò chơi công bằng cho các nhà phát triển.
không ai

Để mở rộng, họ "nên [...] tránh các tham số thoát do người dùng chỉ định."
l0b0

@AndrewMedico Đây không phải là khá đúng: 0 cho sự thành công không chỉ là một vấn đề của quy ước, nó được xây dựng vào rất nhiều công cụ bao gồm vỏ ( &&, ||, !, set -e, ...).
Gilles 'SO- ngừng trở nên xấu xa'

Các mục cho 1 và 2 không có nhiều ý nghĩa. 1 và 2 không được bảo lưu. Nội dung Bash thậm chí không luôn luôn sử dụng 2 - trên thực tế, chúng dường như sử dụng 1 cho các lỗi; các shell khác sử dụng các mã lỗi khác nhau (thường là 1 hoặc 2). Thiếu từ khóa và diffkhông có nội dung tích hợp. 1 và 2 đều là những sản phẩm khai thác phổ biến.
Gilles 'SO- ngừng trở nên xấu xa'
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.