Menemukan definisi fungsi bash

41

Saya bekerja di lingkungan yang memiliki banyak naskah skrip shell warisan tergeletak di sekitar. Satu hal yang digunakan berat dari baris perintah adalah fungsi bash yang bersumber dari beberapa file termasuk dari beberapa file yang disertakan dari beberapa file ... termasuk dalam .bash_profile saya. Apakah ada cara untuk mendapatkan definisi atau bahkan lebih baik lokasi definisi fungsi-fungsi ini tanpa melacaknya melalui 5 level termasuk?

metafora pythonic
sumber

Jawaban:

39

Untuk mendapatkan definisi fungsi:

type -a function_name
Dijeda sampai pemberitahuan lebih lanjut.
sumber
@iconoclast: Ya.
Dijeda sampai pemberitahuan lebih lanjut.
Jika Anda pernah berada di Grand Rapids, saya akan membelikan Anda secara langsung ... jika tidak, kami dapat menemukan cara lain ...
iconoclast
whence -f function_nameinzsh
dezza
66

Dengan asumsi Anda memiliki fungsi bernama foo perintah di bawah ini akan mendapatkan lokasi definisi fungsi, yaitu akan mendapatkan nama file di mana fungsi tersebut didefinisikan serta nomor baris di mana fungsi tersebut didefinisikan dalam file tersebut .

# 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

Dalam kasus saya, output dari perintah ini adalah:

foo 32 /source/private/main/developer/cue.pub.sh
Bulu anjing
sumber
3
Sempurna. Saya baru saja menjadikan ini sebagai fungsi bash di file bashrc saya. whereisfunc() {shopt -s extdebug;declare -F $1;shopt -u extdebug}
Neil
5
@ Neil: Itu berguna, terima kasih: izinkan saya menyarankan menggunakan subkulit untuk melokalisasi efek shopttanpa mengubah keadaan shell saat ini: whichfunc () ( shopt -s extdebug; declare -F "$1"; )(perhatikan penggunaan (...)bukannya {...}).
mklement0
Mengapa perintah itu tidak berfungsi dari skrip? fungsi berfungsi dengan benar
albfan
1
Ini harus menjadi jawaban yang diterima.
dibubarkan
11

Untuk melihat definisi fungsi (sebagai lawan dari mana asalnya), gunakan:

declare -f <functionname>
Joshua Goldberg
sumber
Saya pikir yang ini lebih baik daripada type -akarena tidak mencetak baris pertama yang mengganggu tergantung lokal ~~
yuyichao
1
tetapi karena tidak ada lokasi yang diberikan, ini adalah jawaban untuk pertanyaan yang tidak diminta
iconoclast
6

bash -xakan membuang apa yang dijalankan bash saat dijalankan, yang seharusnya membuat Anda melacaknya lebih mudah. Jangan lupa untuk keluar dari shell yang baru dibuka.

Ignacio Vazquez-Abrams
sumber
Barang berguna; untuk menangkap jejak dalam file, gunakan script out.txt bash -x(sekali lagi, jangan lupa exit).
mklement0
-2

cara lain, yang saya temukan lebih sederhana belakangan ini:

  which <functionname>

(ini juga akan menunjukkan apakah itu alias atau skrip, tetapi tidak akan melacak sumber alias)

Joshua Goldberg
sumber
2
Saya tidak berpikir whichmemberikan informasi tentang alias di BSD atau mac. Selain itu, pertanyaan ini tentang fungsi, dan whichtidak memberikan informasi tentang fungsi.
dbn
Terima kasih atas catatan itu. Saya melihat sekarang bahwa "yang" hanya menyelesaikan fungsi dalam zsh, bukan bash.
Joshua Goldberg
2
Saya pikir jawaban ini cenderung mengundang downvotes ... sepertinya tidak menjawab pertanyaan sama sekali, karena tidak ada informasi tentang lokasi.
iconoclast
Saya menemukan ini berguna untuk melacak deklarasi untuk menggunakan ini dan mencari tahu apakah itu alias atau fungsi, dan untuk mengetahui sintaks yang menyatakannya. Memang benar bahwa hanya jawaban @ HairOfTheDog yang memberikan file secara langsung.
Joshua Goldberg