bash işlevi meta verilerini atama ve inceleme


10

Geliştirme projelerimde genellikle yaptığım görevlerin çoğunu otomatikleştiren birçok bash işlevi oluşturup kaydediyorum. Bu nesil üzerinde çalıştığım projenin meta verilerine bağlı.

Bu şekilde oluşturuldukları proje bilgileri ile işlevlere açıklama eklemek istiyorum:

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

İdeal olarak, tanımı incelerken yorumu görebileceğim:

$ type func1

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

Ancak bash, bir şekilde , işlevi yüklerken değil, yorumları yüklerken yorumları görmezden geliyor gibi görünüyor. Böylece yorumlar kaybolur ve bu sonucu alırım:

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

İşlevlere meta veri atamanın ve daha sonra bunları kontrol etmenin herhangi bir yolu var mı? Tanımı tür ile incelerken geri almak mümkün mü?


1
Değil bir çözeltisi (dolayısıyla açıklama), ancak I iş çevresinde kullanılması durumunda kontrol etmektir $1olduğunu -hve daha sonra printf/ echotek satırlık yardım / kullanım / ne olursa olsun.
John N

Yanıtlar:


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, bash öğretileri. Kim biliyordu?
Brian Minton

Bu yorumu sorgulamanın herhangi bir yolu var mı? Tüm komutlar için bir genery yardım işlevi üzerinde düşünüyorum.
Yucer

7

Evet, typebir işlevin yalnızca çalıştırılacak kısımlarını yazdırıyor gibi görünüyor. Bu benim için makul görünüyor, çünkü sorgulama yaparken genellikle ilgilendiğiniz bu kadar type.

Çözüm olarak, yorumları kullanmak yerine meta verilerinizi şu şekilde ekleyin:

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

Bu değişkeni gerçekten kullanmaya gerek yoktur, ancak işlev şu şekilde sorgulanırken görünür type:

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

2
Bir değişkeni depolamaktan kaçınmak istiyorsanız, ":" nop operatörünü şu şekilde kullanabilirsiniz: function func () {: "metadata" # do yours}
Luchostein 9:01 '

1
Bence tek tırnak burada çift tırnak daha iyidir, sadece docstring saklanan istenmeyen genişletmeler olması durumunda
Dijital Travma

6

Nop yerleşimini kullanabilirsiniz :. Ayrıca, bir değişken olarak saklamanız gerekmez:

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

EDIT : Meta verilerinize özel karakterlere dikkat edin. Saf metin için şunları kullanabilirsiniz:

: <<EOT
Your metadata text here.
EOT

DÜZENLEME : Bunun yerine tüm işlevin meta verilerini depolamak için genel ilişkilendirilebilir bir dizi kullanabilirsiniz:

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

Bu şekilde, ayrıştırmak gerekmez declareveya typebir dizinin anahtarı için sadece sorgu ancak, 'ın çıkışı.


1
Dikkatli olun - your metadata hereyan etkileri olan genişlemeleri içerebilir. @ AlexP'nin cevabı gibi tek tırnak kullanmak daha iyidir.
Dijital Travma

Evet, ancak tırnak içinde dikkatli olmalısınız.
Luchostein

3

Bunu yapabilirsiniz.

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

ancak açıklama eklendikten sonra işlev yine de yapmalıdır. Örnek normalde çağırdığınızda yankı hala çalışması gerekir dahil ettim.
Yucer

@yucer Olur. Bu sadece bir örnek. Dene. Yine de sınırlamaları vardır. Hiçbir özel karakter (kullanılamaz ve ilk sözcük geçerli bir komut olmamalıdır.

Tamam. Çalıştırmak için ekstra zaman almasına rağmen, geçerli bir cevap olduğunu düşünüyor. Ayrıca, örneğimde kullandığım yankı ve meta verileri eklemek daha iyi olabilir.
YÜCER
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.