Định nghĩa hàm Shell: tại sao có khoảng trắng sau dấu ngoặc mở?


18

Bạn có thể biết về quả bom ngã ba đó :

 :(){ :|:&};: #WARNING: harmful code

Tôi tự hỏi tại sao nó là cần thiết, để nó phân tích, để bao gồm một khoảng trống sau khi mở ngoặc nhọn.

Câu trả lời:


13

{}

          { list; }

Đặt một danh sách các lệnh giữa các dấu ngoặc nhọn làm cho danh sách được thực thi trong bối cảnh shell hiện tại. Không có subshell được tạo ra. Danh sách dấu chấm phẩy (hoặc dòng mới) là bắt buộc.

Ngoài việc tạo ra một subshell, có một sự khác biệt tinh tế giữa hai cấu trúc này vì lý do lịch sử. Các dấu ngoặc nhọn là các từ dành riêng, vì vậy chúng phải được phân tách khỏi danh sách bằng khoảng trắng hoặc các ký tự đại diện hệ vỏ khác. Các dấu ngoặc đơn là các toán tử và được công nhận là các mã thông báo riêng biệt bằng vỏ ngay cả khi chúng không được phân tách khỏi danh sách bằng khoảng trắng.

// nguồn


1
Tôi đã ngụy biện với câu trả lời của bạn trong bài viết của riêng tôi trên trang này. Đây là một chức năng không phải là một nhóm lệnh.
donothings thành công

3
@donothingsuccessfully Một cơ quan chức năng một nhóm lệnh.
Gilles 'SO- đừng trở nên xấu xa'

3

Tôi nghĩ rằng @rush có thể đưa ra một câu trả lời đúng nếu câu trả lời sai ở đây. Bom ngã ba xác định một chức năng gọi là " :". Mã trong các dấu ngoặc nhọn không được thực thi cho đến khi hàm được gọi bởi "" cuối cùng :. Vì vậy, các dấu ngoặc nhọn như nhóm lệnh và các dấu ngoặc nhọn như thân hàm có cú pháp giống nhau nhưng có ngữ nghĩa khác nhau.
Từ cùng một tài liệu như @rush trích dẫn:

Lưu ý rằng vì lý do lịch sử, trong cách sử dụng phổ biến nhất, các dấu ngoặc nhọn bao quanh thân hàm phải được tách ra khỏi thân bằng khoảng trắng hoặc dòng mới. Điều này là do các dấu ngoặc nhọn là các từ dành riêng và chỉ được nhận dạng như vậy khi chúng được phân tách khỏi danh sách lệnh bằng khoảng trắng hoặc metacharacter vỏ khác. Ngoài ra, khi sử dụng dấu ngoặc nhọn, danh sách phải được chấm dứt bằng dấu chấm phẩy, '&' hoặc dòng mới.


3
Không, câu trả lời của rush là chính xác. Các dấu ngoặc nhọn quanh thân hàm là yếu tố cú pháp giống như khi chúng không được phân định một thân hàm. Xem các quy tắc ngữ pháp shell : a function_bodylà một compound_command(cộng với một tùy chọn redirect_list). Không gian là cần thiết bởi vì {là một từ dành riêng, không phải là một ký tự đặc biệt.
Gilles 'SO- đừng trở nên xấu xa'

Vâng, câu trả lời của rush là chính xác, như tôi đã nói. Vâng, chúng là cú pháp giống nhau, như tôi đã nói. Nhưng brace_groups hành xử khác nhau khi một phần của chức năng và khi không. Tôi đã sử dụng nhóm lệnh để mô tả trường hợp sau và đây là những gì được mô tả trong liên kết của rush.
donothings thành công

2
Tôi không chắc sự khác biệt về ngữ nghĩa có ý nghĩa ở đây, vì đó là cú pháp quan trọng đối với trình phân tích cú pháp. Câu trả lời thực sự {không phải là một toán tử mà là một từ dành riêng và các từ cần phải được tách ra khỏi các từ khác để được coi là khác biệt.
jw013
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.