2012-10-22 29 views
7

Tôi đang sử dụng set -e để hủy lỗi.Lỗi bỏ qua Bash và lấy mã trả lại

Nhưng đối với một chức năng cụ thể, tôi muốn bỏ qua lỗi và do lỗi, tôi muốn mã trả về của hàm.

Ví dụ:

do_work || true 
if [ $? -ne 0 ] 
    then 
    echo "Error" 
    fi 

Nhưng nó không được làm việc mã trở lại luôn luôn đúng do || true

Làm cách nào để nhận mã trả về do_work do lỗi?

+0

Tại sao bạn không tắt thoát khỏi lỗi ngay trước cuộc gọi đó? – Mat

+0

@Mat ya sẽ cảm ơn bạn. Nhưng với mục đích tri thức thì có cách nào tôi có thể nắm bắt được mã trả lại không? –

Trả lời

6
do_work || { 
    status=$? 
    echo "Error" 
} 
4

Bạn có thể sử dụng một phím tắt subshell:

(set +e; do_work) 
if [ $? -ne 0 ] 
    then 
    echo "Error" 
    fi 

Hope this helps =)

4

Một cách là sử dụng một đường ống, -e chỉ nhìn vào phải hầu hết kết quả của một ống:

set -e 

do_work | true 

retn=${PIPESTATUS[0]} 
if (($retn != 0)) 
then 
    echo "Error $retn" 
fi  
echo Ending 

Tôi đã viết đơn giản do_work chỉ cần thực hiện exit 42 và nhận được kết quả sau:

Error 42 
Ending 

Mảng PIPESTATUS được duy trì bởi Bash, với mỗi phần tử đưa ra mã trả về của từng phần của đường ống. Chúng ta cần phải nắm bắt nó cùng một lúc (do đó $retn) vì nó được ghi đè ở mỗi lệnh.

Tất nhiên điều này có thể có vấn đề nếu do_work của bạn bao gồm chính ống.

1
do_work || status=$? 
if [ $status -ne 0 ] 
then 
    echo "Oh no - Fail whale $status has arrived" 
fi 
4

Một số các câu trả lời đưa ra ở đây là không đúng, bởi vì họ cho kết quả trong một thử nghiệm chống lại một biến mà sẽ un xác định nếu do_work thành công.

Chúng ta cần để trang trải các trường hợp thành công như tốt, vì vậy câu trả lời là:

set -eu 
do_work && status=0 || status=1 

Câu hỏi đặt ra của thành viên này là một chút nhầm lẫn vì nó nói trong văn bản "về lỗi tôi muốn quay trở lại mã" nhưng sau đó đang ngụ ý "tôi luôn muốn mã trở lại"

Để minh họa, đây là mã có vấn đề:

set -e 

do_work() { 
    return 0 
} 

status=123 

do_work || status=$? 
echo $status 

Trong mã này giá trị in là 123, và không phải là 0 như chúng ta có thể h ope cho.

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