2011-08-07 31 views
45

Trên diff người đàn ông trang tôi đã tìm thấy những giá trị xuất cảnh:Giá trị thoát lỗi cho diff là gì?

0  No differences were found. 
    1  Differences were found. 
    >1  An error occurred. 

Có giá trị xuất cảnh khác nhau trên 1 cho các lỗi khác nhau?

Trả lời

48

Tùy thuộc vào lệnh diff của bạn. Mine (GNU diffutils 3.0) nói:

Một trạng thái thoát của 0 nghĩa là không khác biệt đã được tìm thấy, 1 nghĩa là một số khác biệt đã được tìm thấy, và 2 nghĩa rắc rối. Thông thường, khác nhau tệp nhị phân được tính là sự cố, nhưng điều này có thể được thay đổi bằng cách sử dụng tùy chọn -a hoặc --text hoặc tùy chọn -q hoặc --brief.

+4

đồng ý, tôi đã kiểm tra các nguồn khác nhau, và các mã lối thoát duy nhất là EXIT_SUCCESS, EXIT_FAILURE (cả quy định tại stdlib.h) và EXIT_TROUBLE , được định nghĩa trong src/diffutils-3.0/system.h –

+0

Tùy chọn '--text' tạo ra một mớ hỗn độn của STDOUT của tôi nếu có hai tệp nhị phân khác nhau (lớn). –

+0

Tôi đang sử dụng diffutils GNU quá nhưng trích dẫn các trang người đàn ông sai. –

6

Có thể có hoặc không có mã lỗi khác nhau tùy thuộc vào phiên bản khác biệt bạn sử dụng. Nếu tôi nhớ chính xác, khác biệt BSD chuẩn luôn trả về mã thoát là 0, 1 hoặc 2.

Tuy nhiên, manpage không lập bản đồ ra mọi thứ khác biệt, nhưng tài liệu bạn có thể sử dụng để sử dụng chỉ huy. Trong một kịch bản lệnh shell, tôi muốn biết nếu các tập tin phù hợp (exit = 0) hoặc không khớp (exit = 1). Tuy nhiên, trong kịch bản lệnh shell của tôi, tôi cũng muốn biết rằng lệnh diff không hoạt động.

diff $file1 file2 > /dev/null 2>&1 
error=$? 
if [ $error -eq 0 ] 
then 
    echo "$file1 and $file2 are the same file" 
elif [ $error -eq 1 ] 
    echo "$file1 and $file2 differ" 
else 
    echo "There was something wrong with the diff command" 
fi 

Hãy tưởng tượng nếu tôi được cho biết rằng 2 có nghĩa là diff lệnh thất bại, nhưng một phiên bản mới hơn của lệnh diff làm một sự phân biệt giữa một tập tin mà bạn không thể đọc được (exit = 2) và một tập tin mất tích (exit = 3). Bây giờ, hãy tưởng tượng nếu tôi đã làm như sau trong một phiên bản trước của lệnh diff, nhưng $file2 không tồn tại:

diff $file1 file2 > /dev/null 2>&1 
error=$? 
if [ $error -eq 2 ] 
then 
    echo "There was something wrong with the diff command" 
elif [ $error -eq 1 ] 
    echo "$file1 and $file2 differ" 
else 
    echo "$file1 and $file2 are the same file" 
fi 

Trong đoạn mã trên, tôi đã kiểm tra cho mã lỗi của 2 và 1, nhưng không phải 3 Vì vậy, thay vì phát hiện một tập tin bị thiếu, tôi giả định rằng các tập tin phù hợp.

Trang manpage đang cố gắng đảm bảo rằng các bản nâng cấp trong tương lai cho hệ điều hành không làm cho hầu hết các kịch bản shell của bạn đột nhiên thất bại. Đó là lý do tại sao có một lệnh riêng biệt awknawk và một lệnh riêng biệt grepegrep.

* Được cập nhật theo nhận xét của @chus.

+3

Hãy cẩn thận: '$?' Được cập nhật sau khi thực thi 'if [$? eq 0] ', do đó, đánh giá' elif' không liên quan đến đầu ra diff. – chus

+1

"Có [có thể hoặc có thể] không phải là các mã lỗi khác nhau tùy thuộc vào phiên bản' diff' bạn sử dụng. " [POSIX 'diff' thoát với 0 khi tệp giống hệt nhau, 1 khi chúng khác nhau và> 1 cách khác] (http://pubs.opengroup.org/onlinepubs/009696799/utilities/diff.html). Vì vậy, bạn không thể giả định 2, nhưng 0 và 1 là an toàn. –

+0

@chus Bạn nói đúng. Tôi sẽ cập nhật câu trả lời của mình. –

3

Trong trường hợp khác tôi trở 127, tìm kiếm nó và tìm thấy nó trong tldp.org "Thoát Codes Với ý nghĩa đặc biệt"

127 "command not found" illegal_command vấn đề có thể xảy ra với $ PATH hoặc một lỗi đánh máy.

Tôi đã sử dụng đường dẫn sai khác. :)

Font: tldp.org/LDP/abs/html/exitcodes.html

Các vấn đề liên quan