ทุบตีสามารถแสดงความหมายของฟังก์ชั่น?


262

มีวิธีดูนิยามฟังก์ชั่นทุบตีในทุบตี?

ตัวอย่างเช่นสมมติว่าฉันกำหนดฟังก์ชัน foobar

function foobar {
    echo "I'm foobar"
}

มีวิธีใดบ้างที่จะได้รับรหัสในภายหลังfoobarหรือไม่

$ # non-working pseudocode
$ echo $foobar
echo "I'm foobar"

คำตอบ:


357

typeใช้ หากfoobarมีการกำหนดไว้เช่นในของคุณ~/.profile:

$ type foobar
foobar is a function
foobar {
    echo "I'm foobar"
}

สิ่งนี้จะตรวจสอบว่าfoobarมันคืออะไรและถ้ามันถูกกำหนดเป็นฟังก์ชั่นมันจะเรียกdeclare -fตามที่อธิบายโดย pmohandras

หากต้องการพิมพ์เฉพาะส่วนของฟังก์ชั่น (เช่นรหัส) ให้ใช้sed:

type foobar | sed '1,3d;$d'

2
@sjsupersumit คำถามที่ถามอย่างชัดเจนถึงวิธีการแก้ปัญหา Bash
bfontaine

210

คุณสามารถแสดงความหมายของฟังก์ชั่นในทุบตีโดยใช้ประกาศ ตัวอย่างเช่น:

declare -f foobar

1
ยอดเยี่ยมจนถึงขั้นใช้งานได้แม้ว่าฟังก์ชันที่กำหนดไว้ในไฟล์สคริปต์ที่โหลดอื่น ๆ ยังใช้งานได้ใน zsh
Diego Nemo

2
ทำงานกับเชลล์เก่าบนระบบที่ไม่ใช่ linux หากคุณใช้typeset -f
Emmanuel

ยังดีที่มันเพิ่งแสดงfunctionความหมายดังนั้นคุณไม่จำเป็นต้องแยกวิเคราะห์ว่าเป็นสิ่งที่คุณต้องการ
ribamar

5
set | sed -n '/^foobar ()/,/^}/p'

สิ่งนี้จะพิมพ์บรรทัดจากคำสั่ง set ของคุณโดยเริ่มต้นด้วยชื่อฟังก์ชัน foobar () และลงท้ายด้วย}


4
set | grep -A999 '^foobar ()' | grep -m1 -B999 '^}'

โดยมี foobar เป็นชื่อฟังก์ชัน


4
ปัญหา: จะแสดงจนถึง "}" ครั้งแรกเท่านั้นซึ่งไม่ใช่ทุกอย่างเมื่อการกำหนดประกอบด้วยการซ้อนของ "{... }" ซึ่ง Bash ไม่อนุญาต
Destiny Architect

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