Cái nào thành ngữ hơn trong tập lệnh bash: `|| đúng` hoặc `| | : `?


36

Tôi không thực hiện quá nhiều kịch bản shell, vì vậy tôi hơi ngạc nhiên khi tôi đọc tài liệu nàygit submodule và tôi thấy cú pháp họ sử dụng trong tài liệu này:

Một trả về khác không từ lệnh trong bất kỳ mô hình con nào làm cho quá trình xử lý chấm dứt. Điều này có thể được ghi đè bằng cách thêm || :vào cuối lệnh.

Tôi đã phải tìm kiếm đó || :là một tốc ký để buộc một lệnh để thoát thành công. Bất cứ khi nào tôi phải thực hiện một lệnh thoát thành công, tôi đã sử dụng || true. Được || :coi là thành ngữ hơn?


Điều đáng chú ý là ||:(không có không gian) cũng có giá trị trong bash. Nó làm điều tương tự như || :hoặc || true.
Bruno Bronosky

Câu trả lời:


38

trueđã không được xây dựng vào vỏ Bourne. :luôn luôn là (đó là cách để nhập ý kiến ​​trước khi #được giới thiệu).

Điều đó, và bởi vì nó ngắn hơn để gõ có lẽ là lý do chính mà mọi người thích :hơn true.

Lưu ý một sự khác biệt khác trong các vỏ POSIX ( bashchỉ, trong chế độ POSIX): trong khi đó truelà một nội trang thông thường (thậm chí không phải dựng sẵn), :là một nội dung đặc biệt . Điều đó có một vài hàm ý, hầu hết trong số đó dường như không có bất kỳ tác động nào trong trường hợp cụ thể này:

  • Nếu một :lệnh thất bại, bao gồm vì chuyển hướng không thành công, điều đó làm cho shell thoát ra. Trong thực tế, điều đó có thể sẽ không tạo ra sự khác biệt trừ khi bạn chuyển hướng sang:

    $ sh -c ': > /   ; echo HERE'
    sh: 1: cannot create /: Is a directory
    $ sh -c 'true > /; echo HERE'
    sh: 1: cannot create /: Is a directory
    HERE
    
  • trong var=value :, varvẫn được đặt thành valuesau khi :trả về, không phải trong trường hợp true:

    $ var=1; var=2 :   ; echo "$var"
    2
    $ var=1; var=2 true; echo "$var"
    1
    

Cũng lưu ý rằng || truecác công trình trong vỏ của rccshgia đình nhưng không || :(nhưng không phải để hủy bỏ set -etrong csh).

|| :không giống như :. Nó có nghĩa là hoặc chạy :khác (có nghĩa là, nếu đường ống trước đó không thành công).

set -e
false

Sẽ khiến shell thoát ra vì set -efalsecó trạng thái thoát khác không (thất bại). Các set -ehiệu ứng bị hủy nếu lệnh đó trả về một trạng thái thoát khác không được sử dụng như một điều kiện như trong:

if false; then ...
while false; do ...
false && : ...
false || : ...

false && :chỉ hủy bỏ set -e. false || :hủy bỏ set -evà đặt trạng thái thoát thành 0như vậy là thành ngữ hơn để nói rằng chúng tôi muốn bỏ qua mã thoát thất bại của lệnh. Hầu hết sẽ cho rằng đó || truelà dễ đọc hơn (truyền đạt ý định rõ ràng hơn).


5
&& :là tuyệt vời, có bất kỳ tài liệu hoặc đọc thêm về điều này? Google cảm thấy
hụt hẫng

5

Nói chung, trong bash, đại tràng :truelà tương đương.

Là | | : được coi là thành ngữ hơn?

Tôi nghĩ rằng nó dựa trên bối cảnh .

Nếu bạn muốn a return valuehoặc conditionluôn luôn đúng, bạn nên sử dụng truetừ khóa, nó sẽ làm cho mã của bạn rõ ràng hơn và cho người xem biết rằng bạn muốn nhấn mạnh giá trị đúng , nghĩa là:

while true; do something

hoặc là

<commnad>
RETURN_VALUE= $? || true

Và nếu bạn không muốn làm gì , hoặc NOPtrong vỏ, bạn nên sử dụng dấu hai chấm:

if condition
then
    : # DO NOTHING HERE
else
    do something
fi 

hoặc là

while conditon
do
    : # DO NOTHING HERE
done

5

Hầu hết các phản hồi này không giải quyết việc sử dụng phổ biến nhất :.

Đầu tiên, cuộc thảo luận này không liên quan đến bất kỳ shell nào không phải là dẫn xuất của Bourne shell ( sh). Điều đó nói rằng, tất cả các vỏ phái sinh Bourne đều xem true:như nhau. Các lập trình viên thường được khuyến khích sử dụng :thay vì true, vì :luôn luôn được tích hợp sẵn trong khi trước đây thường có những trường hợp truekhông phải lúc nào cũng được tích hợp sẵn.

:có hai công dụng. Nó không phải là từ đồng nghĩa với #, nhưng nó có chức năng khác. Khi gỡ lỗi tập lệnh của bạn theo a set -x, các dòng #được sử dụng sẽ bị trình phân tích cú pháp loại bỏ và hoàn toàn bị bỏ qua, trong khi các dòng có :phân tích cú pháp và đánh giá. Điều này thực sự hữu ích trong việc gỡ lỗi vì dưới -xcác dòng đó được hiển thị và giá trị của chúng sau khi đánh giá được hiển thị. Nó giống như đặt các printcâu lệnh trong mã của bạn chỉ hiển thị dưới -xchế độ. Hãy cẩn thận với các giá trị sau :khi chúng là mã thực và các tác dụng phụ có thể ảnh hưởng đến chương trình của bạn.


1
Việc sử dụng thứ hai là gì?
Peter Mortensen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.