gán và kiểm tra siêu dữ liệu hàm bash


10

Tôi thường tạo và đăng ký rất nhiều hàm bash tự động hóa nhiều nhiệm vụ tôi thường làm trong các dự án phát triển của mình. Thế hệ đó phụ thuộc vào siêu dữ liệu của dự án tôi đang làm.

Tôi muốn chú thích các chức năng với thông tin của dự án mà chúng được tạo, theo cách này:

func1() {
# This function was generated for project: PROJECT1
echo "do my automation"
}

Lý tưởng nhất, tôi sẽ có thể thấy bình luận khi tôi kiểm tra định nghĩa:

$ type func1

func1 is a function
func1 () 
{
    # This function was generated for project: PROJECT1
    echo "do my automation"
}

Nhưng bằng cách nào đó bash dường như bỏ qua các bình luận tại thời điểm tải chức năng, không phải khi thực hiện nó. Vì vậy, các ý kiến ​​bị mất và tôi nhận được kết quả này:

func1 is a function
func1 () 
{
    echo "do my automation"
}

Có cách nào để gán siêu dữ liệu cho các hàm và kiểm tra chúng sau đó không? Có thể lấy nó khi kiểm tra định nghĩa với loại?


1
Không phải là một giải pháp (do đó bình luận), nhưng công việc xung quanh tôi sử dụng là để kiểm tra xem $1-h, và sau đó printf/ echomột dòng help / sử dụng / bất cứ điều gì.
John N

Câu trả lời:


13
function func_name()
{
  : '
  Invocation:   func_name $1 $2 ... $n
  Function:     Display the values of the supplied arguments, in double quotes.
  Exit status:  func_name always returns with exit status 0.
  ' :
  local i
  echo "func_name: $# arguments"
  for ((i = 1; i <= $#; ++i)); do
    echo "func_name [$i] \"$1\""
    shift
  done
  return 0
}

2
hmmm, tài liệu trong bash. Ai biết?
Brian Minton

Có cách nào để truy vấn nhận xét đó? Tôi suy nghĩ về một chức năng trợ giúp genery cho tất cả các lệnh.
yucer

7

Có, typedường như chỉ in ra các phần của một chức năng sẽ được chạy. Điều này có vẻ hợp lý với tôi, thực sự, vì thường đó là tất cả những gì bạn quan tâm khi truy vấn type.

Để khắc phục, thay vì sử dụng nhận xét, hãy thêm dữ liệu meta của bạn như thế này:

func1() {
    meta="This function was generated for project: PROJECT1"
    echo "do my automation"
}

Không cần thực sự sử dụng biến đó, nhưng nó sẽ xuất hiện khi truy vấn hàm với type:

$ type func1
func1 is a function
func1 () 
{ 
    meta="This function was generated for project: PROJECT1";
    echo "do my automation"
}

2
Nếu bạn muốn tránh lưu trữ một biến, bạn có thể sử dụng toán tử nop ":" theo cách này: function func () {: "metadata" # do
your

1
Tôi nghĩ rằng trích dẫn đơn tốt hơn dấu ngoặc kép ở đây, chỉ trong trường hợp có bất kỳ mở rộng không mong muốn nào ẩn trong chuỗi tài liệu
Chấn thương kỹ thuật số

6

Bạn có thể sử dụng nội dung nop: . Ngoài ra, bạn không cần lưu trữ dưới dạng một biến:

function f() {
  : your metadata here
  : "or here"
  # do yours
}

EDIT : Coi chừng các ký tự đặc biệt vào siêu dữ liệu của bạn. Đối với văn bản thuần túy, bạn có thể sử dụng:

: <<EOT
Your metadata text here.
EOT

EDIT : Thay vào đó, bạn có thể sử dụng một mảng kết hợp toàn cầu để lưu trữ siêu dữ liệu của chức năng:

declare -A METADATA=()
METADATA[fun1]='foo bar'
function fun1() {
  echo I have some metadata: "${METADATA[$FUNCNAME]}"
}
METADATA[fun2]='baz you'
function fun2() {
  echo I have some other metadata: "${METADATA[$FUNCNAME]}"
}

Theo cách này, bạn không cần phân tích cú pháp declarehoặc typeđầu ra, mà chỉ truy vấn khóa của một mảng.


1
Hãy cẩn thận - your metadata herecó thể chứa các bản mở rộng có tác dụng phụ. Tốt hơn là sử dụng các trích dẫn đơn như câu trả lời của @ AlexP.
Chấn thương kỹ thuật số

Có, nhưng bạn cũng nên cẩn thận trong dấu ngoặc kép.
Luchostein

3

Bạn có thể làm được việc này.

$ f() { This function does nothing. 2> /dev/null; }
$ f
$ type f
f is a function
f () 
{ 
    This function does nothing. 2> /dev/null
}

nhưng chức năng vẫn nên làm công cụ của nó sau khi được chú thích. Trong mẫu tôi đã bao gồm tiếng vang vẫn hoạt động khi tôi gọi hàm bình thường.
yucer

@yucer Nó sẽ. Đây chỉ là một minh họa. Thử nó. Nó có những hạn chế của nó mặc dù. Không có ký tự đặc biệt nào (có thể được sử dụng và từ đầu tiên không phải là một lệnh hợp lệ.

Đồng ý. Nó nghĩ rằng đó là một câu trả lời hợp lệ, mặc dù phải mất thêm thời gian để chạy. Ngoài ra, có thể tốt hơn là bao gồm tiếng vang và siêu dữ liệu mà tôi đã sử dụng trong ví dụ của mình.
yucer
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.