2012-09-20 10 views
22

Tôi có tập lệnh bash với tập hợp tùy chọn -e, không thực hiện được toàn bộ tập lệnh trên lỗi đầu tiên.Làm thế nào để tránh một tập lệnh bash không thành công khi tùy chọn -e được thiết lập?

Trong tập lệnh, tôi đang cố gắng thực hiện một ls trên một thư mục. Nhưng con đường đó có thể có hoặc không tồn tại. Nếu đường dẫn không tồn tại, lệnh ls không thành công, vì cờ -e được đặt.

Có cách nào để ngăn chặn tập lệnh không thành công không?

Là một lưu ý phụ, tôi đã thử các mẹo để thực hiện set +eset -e trước và sau lệnh đó và nó hoạt động. Nhưng tôi đang tìm một số giải pháp tốt hơn.

Trả lời

30

Bạn có thể "bắt" các lỗi sử dụng || và một lệnh được bảo đảm để thoát với 0 trạng thái:

ls $PATH || echo "$PATH does not exist" 

Vì lệnh ghép nối thành công hay không $PATH tồn tại, set -e không được kích hoạt và tập lệnh của bạn sẽ không thoát.

Để ngăn chặn các lỗi âm thầm, bạn có thể sử dụng true lệnh:

ls $PATH || true 

Để thực hiện nhiều lệnh, bạn có thể sử dụng một trong những hợp chất lệnh:

ls $PATH || { command1; command2; } 

hoặc

ls $PATH || (command1; command2) 

Chỉ cần chắc chắn không có gì thất bại bên trong một trong hai lệnh ghép. Một lợi ích của ví dụ thứ hai là bạn có thể tắt chế độ ngay lập tức-exit bên trong subshell mà không ảnh hưởng tình trạng của nó trong vỏ hiện tại:

ls $PATH || (set +e; do-something-that-might-fail) 
+0

Cảm ơn bạn đã phản hồi. Tôi vẫn còn vài nghi ngờ. Nếu lệnh 'ls' không thành công, nó vẫn in một thông báo, vì vậy nó tồn tại và do đó, có một cách để ngăn chặn điều đó? Ngoài ra, trong phần 'OR', có cách nào để thực thi 2 dòng mã không? – Bhushan

2

một giải pháp sẽ được kiểm tra sự tồn tại của thư mục

function myLs() { 
    LIST="" 
    folder=$1 
    [ "x$folder" = "x" ] && folder="." 
    [ -d $folder ] && LIST=`ls $folder` 
    echo $LIST 
} 

cách bash này sẽ không thất bại nếu $folder không tồn tại

5

Một lựa chọn khác là sử dụng trap để bắt EXIT tín hiệu:

trap 'echo "ls failed" ; some_rescue_action' EXIT 
ls /non_exist