bash
  • shell
  • 2015-03-30 4132 views 6 likes 
    6

    Script test.sh:bẫy ERR không được gọi khi thiết readonly biến

    set -euo pipefail 
    
    function _trap_ext 
    { 
        echo '_trap_ext' 
    } 
    function _trap_error 
    { 
        echo '_trap_error' 
    } 
    trap "_trap_ext" EXIT 
    trap "_trap_error" ERR 
    
    readonly foo='bar' 
    foo='bar' 
    
    echo 'foobar' 
    

    Output:

    ./test.sh: line 14: foo: readonly variable 
    _trap_ext 
    

    Kịch bản chấm dứt tại dòng 14 vì lỗi (-e tùy chọn) nhưng _trap_error chức năng không phải là gọi là. Tại sao không?

    GNU bash, phiên bản 4.1.2 (1) -release (x86_64-biết-linux-gnu), 4.2.45 (1) -release (i586-suse-linux-gnu)

    +0

    FWIW Tôi không có lỗi này trong 4.3.33, nhưng tôi cũng không thấy bất kỳ điều gì trong [nhật ký thay đổi] (http://tiswww.case.edu/php/chet/bash/CHANGES) rõ ràng biểu thị sự sửa chữa của nó. – kojiro

    Trả lời

    1

    này nghe có vẻ như nó có thể là một lỗi. Từ trang người đàn ông:

    -e
    Exit ngay lập tức nếu một đường ống (có thể bao gồm một lệnh đơn giản duy nhất), một danh sách, hoặc một lệnh phức hợp (xem SHELL ở trên), thoát ra với một tổ chức phi trạng thái -zero.
    ...
    Một bẫy trên ERR, nếu được đặt, được thực hiện trước khi thoát khỏi trình bao. Tùy chọn này áp dụng cho môi trường shell và mỗi môi trường subshell riêng biệt (xem COMMAND MÔI TRƯỜNG ở trên), và có thể gây ra subshells để thoát ra trước khi thực hiện tất cả các lệnh trong subshell.

    Từ trang người đàn ông nói, nên thực hiện bẫy ERR. Bạn có thể kiểm tra xem nó có hoạt động như mong đợi trong các trường hợp khác hay không bằng cách chèn false trước câu lệnh foo='bar'. Nó cũng xuất hiện rằng bash không gọi bẫy ERR về lỗi cú pháp, vì vậy nó có thể là cố gắng ghi đè lên một biến chỉ đọc rơi vào một loại lỗi tương tự mà bỏ qua bẫy ERR. Tuy nhiên, lời giải thích đó là đầu cơ thuần túy.

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