Thông thường, chức năng bash được định nghĩa sử dụng dấu ngoặc nhọn để kèm theo cơ thể:chức năng bash: bao quanh cơ thể trong niềng răng vs ngoặc
foo()
{
...
}
Khi làm việc trên một kịch bản shell hiện nay việc sử dụng các chức năng, tôi đã chạy vào các vấn đề với các biến có cùng tên trong hàm được gọi là trong hàm gọi, cụ thể là các biến đó giống nhau. Sau đó tôi đã phát hiện ra rằng điều này có thể được ngăn chặn bằng cách xác định các biến cục bộ bên trong hàm như là địa phương: local var=xyz
.
Sau đó, tại một số điểm, tôi đã phát hiện ra một sợi (Defining bash function body using parenthesis instead of braces) trong đó nó được giải thích rằng đó chỉ là hợp lệ để xác định một chức năng sử dụng dấu ngoặc đơn như thế này:
foo()
(
...
)
Hiệu quả của việc này là rằng thân hàm được thực hiện trong một vỏ con, có lợi ích là hàm có phạm vi biến riêng của nó, cho phép tôi định nghĩa chúng mà không có cục bộ. Kể từ khi có một phạm vi chức năng địa phương dường như có ý nghĩa nhiều hơn nữa và để được an toàn hơn nhiều so với tất cả các biến là toàn cầu, tôi ngay lập tức tự hỏi mình:
- Tại sao niềng răng được sử dụng bởi mặc định kèm theo cơ quan chức năng thay vì dấu ngoặc đơn ?
Tuy nhiên, tôi nhanh chóng cũng phát hiện ra một nhược điểm lớn để thực hiện các chức năng trong một subshell, cụ thể là thoát khỏi kịch bản từ bên trong một hàm không hoạt động nữa, thay vào đó buộc tôi phải làm việc với tư cách trở lại dọc theo toàn bộ cây gọi (trong trường hợp hàm lồng nhau). Điều này dẫn tôi đến câu hỏi tiếp theo này:
- Có nhược điểm lớn khác (*) để sử dụng dấu ngoặc đơn thay vì niềng răng (mà có thể giải thích tại sao niềng răng dường như được ưa thích)?
(*) Tôi biết (từ các cuộc thảo luận ngoại lệ liên quan đến tôi stumbled khi theo thời gian) mà một số người cho rằng sử dụng một cách rõ ràng tình trạng lỗi là tốt hơn nhiều so với việc có thể để thoát khỏi bất cứ nơi nào, nhưng tôi thích cái sau.
Dường như cả hai kiểu đều có ưu điểm và nhược điểm của chúng. Vì vậy, tôi hy vọng một số bạn sử dụng bash nhiều kinh nghiệm có thể cho tôi một số hướng dẫn chung:
- Khi tôi phải sử dụng dấu ngoặc nhọn để kèm theo cơ quan chức năng, và khi nào là nó khuyến khích chuyển sang ngoặc?
EDIT: Take-aways từ câu trả lời
Cám ơn câu trả lời của bạn, người đứng đầu của tôi bây giờ là một chút rõ ràng liên quan đến này. Vì vậy, những gì tôi lấy đi từ những câu trả lời là:
Stick với dấu ngoặc nhọn thông thường, nếu chỉ để không nhầm lẫn tiềm năng khác mà người dùng/nhà phát triển của kịch bản (và thậm chí sử dụng niềng răng nếu toàn bộ cơ thể được bọc trong ngoặc đơn).
Điểm bất lợi duy nhất của dấu ngoặc nhọn là bất kỳ biến nào trong phạm vi gốc đều có thể thay đổi, mặc dù trong một số trường hợp, đây có thể là một lợi thế. Điều này có thể dễ dàng bị phá vỡ bằng cách khai báo các biến là
local
.Sử dụng dấu ngoặc đơn, có thể có một số hiệu ứng không mong muốn nghiêm trọng, chẳng hạn như thoát ra, dẫn đến các sự cố khi giết tập lệnh và cách ly phạm vi biến.
Chỉnh sửa của bạn rất tốt! – fedorqui