2013-07-03 31 views
7

Tôi có một kịch bản để kiểm tra trạng thái thoát của hàm sau:Làm cách nào để kiểm tra trạng thái thoát khác của lệnh trong Bash?

function is_git_repository {              
    git branch &> /dev/null              
} 

nào trả 0 nếu bạn đang ở trong một repo git, và 128 nếu bạn không.

Tôi không có sự cố kiểm tra để xem liệu giá trị trả lại có là 0 hay không; các công việc sau như mong đợi:

if is_git_repository ; then 
    echo you are in a git repo 
else 
    echo you are NOT in a git repo 
fi 

Nhưng đó là khi tôi đang cố gắng để kiểm tra cho một trạng thái thoát đó là bất cứ điều gì khác hơn là 0 khi tôi đang chạy vào vấn đề. Tôi đã thử những điều sau đây, nhưng không ai trong số họ làm việc:

  1. if [[ "$(is_git_repository)" != "0" ]] ; ... luôn trả về true (link)
  2. if [[ "$(is_git_repository)" -ne "0" ]] ; ... luôn là false
  3. if [[ "$(is_git_repository)" != 0 ]] ; ... luôn trả về true
  4. if [[ "$(is_git_repository)" -ne 0 ]] ; ... luôn đánh giá false
  5. if [[ ! "$(is_git_repository)" ]] ; ... luôn luôn đánh giá là đúng
  6. if !is_git_repository ; ... chỉ lặp lại c ommand trở lại với tôi, nhưng không có bang (wtf?)

Cách chính xác để kiểm tra trạng thái thoát khác của lệnh trong câu lệnh if là gì?

+1

Bạn dường như đang tìm kiếm $? – devnull

+0

"Nguồn" bạn đã liên kết đến không phải là câu trả lời được chấp nhận cũng như không được bình chọn cao nhất cho câu hỏi. –

Trả lời

7

Tôi sớm tìm ra rằng if ! is_git_repository ; then ... hoạt động như dự định (xem dưới 7.1.2.1. Thử nghiệm trạng thái thoát trong Introduction to if), nhưng tại sao? Tôi đã mong đợi rằng # 1 sẽ làm việc ít nhất, nhưng tôi không biết tại sao nó không.

Ngoài ra, điều gì đang xảy ra với # 6 ?!

+3

Khi bạn nói '" $ (is_git_repository) "' bạn lấy lại * đầu ra tiêu chuẩn * của lệnh, không phải là * trạng thái thoát *. Bạn chuyển hướng stdout và stderr, do đó, luôn luôn là chuỗi rỗng mà luôn luôn không bằng chuỗi "0". bash là khoảng trắng nhạy cảm để '!' cần đứng một mình. Như @devnull đề cập, nếu bạn muốn trạng thái thoát, bạn cần biến '$?'. –

+0

@glennjackman Cảm ơn! Giải thích nó. Thế còn những người có '-ne' thì sao? Tại sao chúng được đánh giá khác với những cái có '! ='? (tức là tại sao một chuỗi rỗng "bằng" thành "0"/0 với '-ne' nhưng không bằng" 0 "/ 0 với'! = '?) – 3cheesewheel

+1

[số học vỏ] (http: // www. gnu.org/software/bash/manual/bashref.html#Shell-Arithmetic) phần của hướng dẫn sử dụng cho biết: "Một giá trị null đánh giá là 0." –

1

Cân nhắc tắt boolean thay vì một tuyên bố if:

is_git_repository || echo you are NOT in a git repo 
Các vấn đề liên quan