menetapkan dan memeriksa metadata fungsi bash

10

Saya sering menghasilkan dan mendaftarkan banyak fungsi bash yang mengotomatiskan banyak tugas yang biasanya saya lakukan dalam proyek pengembangan saya. Generasi itu tergantung pada meta-data dari proyek yang saya kerjakan.

Saya ingin membubuhi keterangan fungsi dengan info proyek yang dihasilkan, dengan cara ini:

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

Idealnya, saya dapat melihat komentar ketika saya memeriksa definisi:

$ type func1

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

Tetapi entah bagaimana bash tampaknya mengabaikan komentar pada saat memuat fungsi, bukan ketika menjalankannya. Jadi komentarnya hilang dan saya mendapatkan hasil ini:

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

Apakah ada cara untuk menetapkan metadata ke fungsi, dan memeriksanya sesudahnya? Dimungkinkan untuk mengambilnya saat memeriksa definisi dengan tipe?

Yucer
sumber
1
Bukan solusi (karena itu komentar), tetapi solusi yang saya gunakan adalah untuk memeriksa apakah $1ada -h, dan kemudian printf/ echobantuan satu baris / penggunaan / apa pun.
John N
2
Lihat juga: unix.stackexchange.com/questions/295022/…
Jeff Schaller

Jawaban:

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
}
AlexP
sumber
2
hmmm, dokumen di bash. Siapa yang tahu?
Brian Minton
Apakah ada cara untuk menanyakan komentar itu? Saya berpikir tentang fungsi bantuan umum untuk semua perintah.
Yucer
7

Ya, typesepertinya hanya mencetak bagian-bagian dari fungsi yang akan dijalankan. Ini sepertinya masuk akal bagi saya, sungguh, karena biasanya hanya itu yang Anda minati ketika bertanya type.

Sebagai solusinya, alih-alih menggunakan komentar, tambahkan data meta Anda seperti ini:

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

Tidak perlu benar-benar menggunakan variabel itu, tetapi itu akan muncul ketika menanyakan fungsi dengan type:

$ type func1
func1 is a function
func1 () 
{ 
    meta="This function was generated for project: PROJECT1";
    echo "do my automation"
}
terdon
sumber
2
Jika Anda ingin menghindari menyimpan variabel, Anda dapat menggunakan operator nop ":" dengan cara ini: function func () {: "metadata" # do yours}
Luchostein
1
Saya pikir tanda kutip tunggal lebih baik daripada tanda kutip ganda di sini, kalau-kalau ada ekspansi yang tidak diinginkan bersembunyi di docstring
Digital Trauma
6

Anda dapat menggunakan nop builtin :. Selain itu, Anda tidak perlu menyimpannya sebagai variabel:

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

EDIT : Waspadalah terhadap karakter khusus ke dalam metadata Anda. Untuk teks murni, Anda dapat menggunakan:

: <<EOT
Your metadata text here.
EOT

EDIT : Anda dapat menggunakan array asosiatif global untuk menyimpan semua metadata fungsi:

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]}"
}

Dengan cara ini, Anda tidak perlu mem declare- parsing atau typeoutput, tetapi hanya permintaan untuk kunci array.

Luchostein
sumber
1
Hati-hati - your metadata herebisa mengandung ekspansi yang memiliki efek samping. Lebih baik menggunakan tanda kutip tunggal seperti jawaban @ AlexP.
Trauma Digital
Ya, tetapi Anda juga harus berhati-hati dalam mengutip.
Luchostein
3

Kamu bisa melakukan ini.

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

sumber
tetapi fungsinya tetap harus melakukan tugasnya setelah dijelaskan. Dalam sampel saya sudah memasukkan gema masih harus bekerja ketika saya memanggil fungsi normal.
Yucer
@ Yucer Itu akan. Ini hanya sebuah ilustrasi. Cobalah. Namun memiliki keterbatasan. Tidak ada karakter khusus seperti yang (dapat digunakan dan kata pertama tidak boleh menjadi perintah yang valid.
Baik. Itu pikir itu adalah jawaban yang valid, meskipun butuh waktu ekstra untuk dijalankan. Juga mungkin lebih baik untuk memasukkan gema dan metadata yang saya gunakan dalam contoh saya.
Yucer