กำหนดและตรวจสอบข้อมูลเมตาของฟังก์ชัน bash


10

ฉันมักจะสร้างและลงทะเบียนฟังก์ชั่นทุบตีจำนวนมากที่ทำงานหลายอย่างที่ฉันทำในโครงการพัฒนาของฉันโดยอัตโนมัติ การสร้างนั้นขึ้นอยู่กับ meta-data ของโครงการที่ฉันกำลังดำเนินการ

ฉันต้องการใส่คำอธิบายประกอบฟังก์ชั่นด้วยข้อมูลของโครงการที่สร้างขึ้นด้วยวิธีนี้:

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

เป็นการดีที่ฉันจะสามารถเห็นความคิดเห็นเมื่อฉันตรวจสอบคำจำกัดความ:

$ type func1

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

แต่อย่างใดทุบตีดูเหมือนว่าจะไม่สนใจความคิดเห็นในขณะโหลดฟังก์ชั่นไม่ได้เมื่อดำเนินการ ดังนั้นความคิดเห็นจะหายไปและฉันได้รับผลลัพธ์นี้:

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

มีวิธีใดบ้างในการกำหนดเมทาดาทาให้กับฟังก์ชันและตรวจสอบภายหลัง เป็นไปได้หรือไม่ที่จะเรียกคืนเมื่อตรวจสอบคำจำกัดความด้วยชนิด?


1
ไม่ใช่วิธีแก้ปัญหา (ด้วยเหตุนี้ความคิดเห็น) แต่การใช้งานโดยรอบคือการตรวจสอบว่า$1มีอยู่-hหรือไม่แล้วprintf/ echoความช่วยเหลือ / การใช้งานแบบบรรทัดเดียว / อะไรก็ตาม
John N

2
ดูเพิ่มเติมที่: unix.stackexchange.com/questions/295022/…
Jeff Schaller

คำตอบ:


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, docstrings ในทุบตี ใครจะรู้
Brian Minton

มีวิธีสอบถามความคิดเห็นนั้นหรือไม่? ฉันคิดในฟังก์ชั่นช่วยเหลือ genery สำหรับคำสั่งทั้งหมด
yucer

7

ใช่typeดูเหมือนว่าจะพิมพ์เฉพาะส่วนของฟังก์ชั่นที่จะทำงาน typeนี้ดูเหมือนว่าเหมาะสมกับผมจริงๆตั้งแต่มักนั่นคือทั้งหมดที่คุณมีความสนใจในเมื่อสอบถาม

ในฐานะที่เป็นวิธีแก้ปัญหาแทนที่จะใช้ความคิดเห็นให้เพิ่มข้อมูลเมตาของคุณดังนี้:

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

ไม่จำเป็นต้องใช้ตัวแปรนั้นจริง ๆ แต่จะปรากฏขึ้นเมื่อสอบถามฟังก์ชันด้วยtype:

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

2
หากคุณต้องการหลีกเลี่ยงการเก็บตัวแปรคุณสามารถใช้ตัวดำเนินการ nop ":" วิธีนี้: function func () {: "metadata" # do
your

1
ฉันคิดว่าคำพูดเดียวดีกว่าเครื่องหมายคำพูดคู่ที่นี่ในกรณีที่มีส่วนขยายที่ไม่ต้องการซ่อนอยู่ใน docstring
Digital Trauma

6

คุณสามารถใช้nop: builtin นอกจากนี้คุณไม่จำเป็นต้องเก็บมันไว้เป็นตัวแปร:

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

แก้ไข : ระวังอักขระพิเศษในข้อมูลเมตาของคุณ สำหรับข้อความล้วนคุณสามารถใช้:

: <<EOT
Your metadata text here.
EOT

แก้ไข : คุณอาจใช้อาเรย์แบบเชื่อมโยงส่วนกลางแทนการเก็บข้อมูลเมตาของฟังก์ชันทั้งหมด:

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

ด้วยวิธีนี้คุณไม่จำเป็นต้องแยกวิเคราะห์declareหรือtypeส่งออก แต่เพียงสอบถามคีย์ของอาร์เรย์


1
ระวัง - your metadata hereอาจมีการขยายที่มีผลข้างเคียง ดีกว่าที่จะใช้เครื่องหมายคำพูดเดี่ยวเช่นคำตอบของ @ AlexP
บาดเจ็บทางดิจิตอล

ใช่ แต่คุณควรระวังในเครื่องหมายคำพูดด้วย
Luchostein

3

คุณสามารถทำได้

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

แต่ฟังก์ชั่นควรทำสิ่งต่าง ๆ หลังจากทำหมายเหตุประกอบ ในตัวอย่างที่ฉันต้องการรวมเสียงก้องยังคงทำงานได้เมื่อฉันเรียกใช้ฟังก์ชันตามปกติ
yucer

@ yucer มันจะ นี่เป็นเพียงภาพประกอบ ลองมัน. มันมีข้อ จำกัด ไม่(สามารถใช้อักขระพิเศษและคำแรกไม่ควรใช้คำสั่งที่ถูกต้อง

ตกลง. มันคิดว่ามันเป็นคำตอบที่ถูกต้องถึงแม้ว่ามันจะใช้เวลาเพิ่มในการรัน นอกจากนี้มันอาจจะดีกว่าที่จะรวมเสียงสะท้อนและข้อมูลเมตาที่ฉันใช้ในตัวอย่างของฉัน
yucer
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.