Gần đây tôi có một số vấn đề kỳ lạ với bash. Trong khi cố gắng đơn giản hóa tập lệnh của mình, tôi đã nghĩ ra đoạn mã nhỏ này:
$ o(){ echo | while read -r; do return 0; done; echo $?;}; o
0
$ o(){ echo | while read -r; do return 1; done; echo $?;}; o
1
returnCó nên thoát khỏi chức năng mà không in $?, không nên? Chà, sau đó tôi đã kiểm tra xem tôi có thể trở về từ một mình không:
$ echo | while read -r; do return 1; done
bash: return: can only `return' from a function or sourced script
Điều tương tự xảy ra mà không có whilevòng lặp:
$ foo(){ : | return 1; echo "This should not be printed.";}
$ foo
This should not be printed.
Có cái gì tôi đang thiếu ở đây? Một tìm kiếm Google không mang lại điều gì về điều này! Phiên bản bash của tôi là 4.2.37 (1) - phát hành trên Debian Wheezy.
whilekhông cần thiết cho việc sao chép? Nó phân tâm từ điểm.
whilevòng lặp là cách sử dụng rất phổ biến cho một đường ống với return. Ví dụ thứ hai thì thẳng thắn hơn, nhưng đó là điều mà tôi không tin bất cứ ai sẽ sử dụng ...