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?

Jawaban:



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

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>

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.


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)


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.