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?
41
whence -f function_name
inzsh
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 .
Dalam kasus saya, output dari perintah ini adalah:
sumber
whereisfunc() {shopt -s extdebug;declare -F $1;shopt -u extdebug}
shopt
tanpa mengubah keadaan shell saat ini:whichfunc () ( shopt -s extdebug; declare -F "$1"; )
(perhatikan penggunaan(...)
bukannya{...}
).Untuk melihat definisi fungsi (sebagai lawan dari mana asalnya), gunakan:
sumber
type -a
karena tidak mencetak baris pertama yang mengganggu tergantung lokal ~~bash -x
akan membuang apa yang dijalankan bash saat dijalankan, yang seharusnya membuat Anda melacaknya lebih mudah. Jangan lupa untuk keluar dari shell yang baru dibuka.sumber
script out.txt bash -x
(sekali lagi, jangan lupaexit
).cara lain, yang saya temukan lebih sederhana belakangan ini:
(ini juga akan menunjukkan apakah itu alias atau skrip, tetapi tidak akan melacak sumber alias)
sumber
which
memberikan informasi tentang alias di BSD atau mac. Selain itu, pertanyaan ini tentang fungsi, danwhich
tidak memberikan informasi tentang fungsi.