Tên hàm script Bash chứa dấu hai chấm '::'


17

Tôi đã bắt gặp một tập lệnh Bash ngày hôm nay có tên hàm với hai dấu hai chấm ::trong đó, ví dụ, file::write()file::read(). Tôi chưa bao giờ thấy cú pháp này trước đây trong một tập lệnh Bash và khi tôi gọi tập lệnh này, nó chạy rất tốt (thật ngạc nhiên).

Sau khi quét trang người đàn ông của Bash trên hệ thống của tôi (và trực tuyến), tôi không thể tìm thấy bất cứ điều gì trong tài liệu hỗ trợ cú pháp này cho tên hàm. Ví dụ, phần Shell Defined Functionsđịnh nghĩa cú pháp cho hàm shell là

function name [()] compound-command [redirection]

và sau đó (ở nơi khác trong hướng dẫn sử dụng) mã thông báo nameđược xác định là

name   A word consisting only of alphanumeric characters and
       underscores, and beginning with an alphabetic character
       or an underscore.  Also referred to as an identifier.

Không có đề cập đến bất cứ nơi nào của cú pháp dấu hai chấm cho tên hàm.

Tài liệu tham khảo khác về cú pháp dấu hai chấm mà tôi đã tìm thấy cho đến nay là trong Hướng dẫn kiểu Shell này (xem phần phụ Naming Conventions > Function Names) khuyến nghị sử dụng cú pháp dấu hai chấm cho tên hàm trong "gói" - ví dụ : mypackage::myfunction().

Đây có phải là cú pháp dấu hai chấm cho tên hàm là một tính năng hợp pháp của shell Bash hay có lẽ nó là một tính năng không có giấy tờ? Nếu nó hợp pháp, nó được ghi lại trong tài liệu hướng dẫn Bash ở đâu? Tôi đã nhìn và nhìn nhưng tôi không thể tìm thấy bất cứ điều gì về nó trong hướng dẫn. Tôi đã tìm thấy gần nhất là việc sử dụng ::trong PATHbiến môi trường để thêm thư mục làm việc hiện tại để con đường tìm kiếm.

THÍ DỤ

#!/bin/bash
function abc::def() {
    echo "${FUNCNAME[0]}"
}
abc::def

Tôi đã thử nghiệm tập lệnh này trên ba bản phân phối Linux khác nhau và trên cả ba tập lệnh được in abc::defra thiết bị xuất chuẩn.


Chúng được cho phép - stackoverflow.com/questions/44558080/ Cách
slm

Người ta cũng có thể thấy %%trong tên hàm unix.stackexchange.com/questions/401166/ Kẻ
michael

Cảm ơn các liên kết. Kì lạ Trước khi đăng bài tôi đã tìm kiếm "bash double dấu hai chấm" (không có dấu ngoặc kép) nhưng không tìm thấy gì. Xin lỗi vì đã hỏi lại một câu hỏi đã được trả lời. .
Jim Fischer

Câu trả lời:


16

Đây là một trường hợp tài liệu chặt chẽ hơn so với việc thực hiện, có thể trong nỗ lực hạ thấp yếu tố súng ngắn. Điều này đã được thảo luận ở đây trước đây ; xem thêm kiểm tra toàn diện xác định rằng ví dụ [}{là tên hàm hợp lệ.

Cũng có thể đáng lưu ý rằng đó abc::defkhông phải là một tên biến hợp lệ:

$ abc::def=foo
bash: abc::def=foo: command not found

4
chỉ để làm cho nó rõ ràng một cách sinh động - không phải file::readcũng không phải [}{là hợp lệ hợp lệ
Steven Penny
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.