การค้นหาคำจำกัดความของฟังก์ชันทุบตี


41

ฉันทำงานในสภาพแวดล้อมที่มีเวทย์มนตร์เชลล์สคริปต์ดั้งเดิมอยู่มากมาย สิ่งหนึ่งที่ใช้งานหนักจากบรรทัดคำสั่งคือฟังก์ชั่นทุบตีที่ได้รับมาจากไฟล์บางไฟล์ที่รวมจากไฟล์บางไฟล์ที่รวมอยู่ในไฟล์บางไฟล์ ... รวมอยู่ใน. bash_profile ของฉัน มีวิธีรับความหมายหรือตำแหน่งของความหมายของฟังก์ชั่นเหล่านี้ที่ดียิ่งขึ้นโดยไม่ต้องติดตามพวกเขาลงถึง 5 ระดับรวมถึง?

คำตอบ:


39

ในการรับฟังก์ชั่นนิยาม:

type -a function_name


หากคุณเคยอยู่ใน Grand Rapids ฉันจะซื้อคุณทีละคน ... มิฉะนั้นเราสามารถหาวิธีอื่นได้ ...
iconoclast

whence -f function_nameในzsh
dezza

66

สมมติว่าคุณมีฟังก์ชั่นชื่อ foo คำสั่งด้านล่างจะได้รับตำแหน่งของคำจำกัดความของฟังก์ชั่นนั่นคือมันจะได้รับชื่อของไฟล์ที่มีการกำหนดฟังก์ชั่นเช่นเดียวกับหมายเลขบรรทัดที่ฟังก์ชั่นที่กำหนดภายในไฟล์นั้น .

# Turn on extended shell debugging
shopt -s extdebug

# Dump the function's name, line number and fully qualified source file  
declare -F foo

# Turn off extended shell debugging
shopt -u extdebug

ในกรณีของฉันผลลัพธ์ของคำสั่งเหล่านี้คือ:

foo 32 /source/private/main/developer/cue.pub.sh

3
สมบูรณ์ ฉันเพิ่งทำสิ่งนี้เป็นฟังก์ชั่นทุบตีในไฟล์ bashrc ของฉัน whereisfunc() {shopt -s extdebug;declare -F $1;shopt -u extdebug}
Neil

5
@Neil: สะดวกดีขอบคุณ: ขอแนะนำให้ใช้ subshell เพื่อ จำกัด ผลของการshoptไม่เปลี่ยนสถานะของเชลล์ปัจจุบัน: whichfunc () ( shopt -s extdebug; declare -F "$1"; )(หมายเหตุการใช้(...)แทน{...})
mklement0

ทำไมคำสั่งเหล่านั้นไม่ทำงานจากสคริปต์ ฟังก์ชั่นทำงานได้อย่างถูกต้อง
albfan

1
นี่ควรเป็นคำตอบที่ยอมรับได้
ละลาย

11

เพื่อดูความหมายของฟังก์ชั่น (ตรงข้ามกับที่มาจาก) ใช้:

declare -f <functionname>

ฉันคิดว่าอันนี้ดีกว่าtype -aเพราะมันไม่ได้พิมพ์บรรทัดแรกขึ้นอยู่กับสถานที่รบกวนรบกวน ~~
yuyichao

1
แต่เนื่องจากไม่มีที่ตั้งเนื่องจากนี่เป็นคำตอบสำหรับคำถามที่ยังไม่ได้ถาม
iconoclast

6

bash -xจะทิ้งสิ่งที่ bash กำลังทำงานเมื่อมันเริ่มต้นขึ้นซึ่งจะช่วยให้คุณติดตามได้ง่ายขึ้น อย่าลืมออกจากเชลล์ที่เพิ่งเปิดใหม่


สิ่งที่มีประโยชน์; ในการจับภาพการสืบค้นกลับในไฟล์ให้ใช้script out.txt bash -x(อีกครั้งอย่าลืมexit)
mklement0

-2

อีกวิธีหนึ่งที่ฉันพบได้ง่ายขึ้นเมื่อเร็ว ๆ นี้:

  which <functionname>

(สิ่งนี้จะแสดงว่าเป็นนามแฝงหรือสคริปต์ แต่จะไม่ติดตามแหล่งที่มาของชื่อแทน)


2
ฉันไม่คิดว่าwhichจะให้ข้อมูลเกี่ยวกับนามแฝงใน BSD หรือ mac นอกจากนี้คำถามนี้เกี่ยวกับฟังก์ชั่นและwhichไม่ได้ให้ข้อมูลเกี่ยวกับฟังก์ชั่น
dbn

ขอบคุณสำหรับบันทึกย่อ ฉันเห็นแล้วว่า "ซึ่ง" แก้ไขฟังก์ชันใน zsh เท่านั้นไม่ใช่การทุบตี
Joshua Goldberg

2
ฉันคิดว่าคำตอบนี้น่าจะเชิญ downvotes ... ดูเหมือนจะไม่สามารถตอบคำถามได้เลยเนื่องจากไม่มีข้อมูลเกี่ยวกับตำแหน่ง
iconoclast

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