Bisakah bash menunjukkan definisi fungsi?

262

Apakah ada cara untuk melihat definisi fungsi bash di bash?

Sebagai contoh, katakanlah saya mendefinisikan fungsi foobar

function foobar {
    echo "I'm foobar"
}

Apakah nanti ada cara untuk mendapatkan kode yang foobarberjalan?

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

Jawaban:

357

Gunakan type. Jika foobarmisalnya didefinisikan dalam Anda ~/.profile:

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

Ini memang mencari tahu apa foobaritu, dan jika itu didefinisikan sebagai fungsi itu panggilan declare -fseperti dijelaskan oleh pmohandras.

Untuk mencetak hanya isi dari fungsi (yaitu kode) gunakan sed:

type foobar | sed '1,3d;$d'
Benjamin Bannier
sumber
2
@ sjsupersumit Pertanyaan secara eksplisit meminta solusi Bash.
bfontaine
210

Anda dapat menampilkan definisi fungsi dalam bash menggunakan menyatakan. Sebagai contoh:

declare -f foobar
pmohandas
sumber
1
Hebat, to the point, bekerja bahkan ketika fungsi didefinisikan dalam file skrip yang dimuat lainnya. Bekerja juga di zsh.
Diego Nemo
2
Bekerja dengan shell lama pada sistem non-linux jika Anda menggunakantypeset -f
Emmanuel
Bagus juga bahwa itu hanya menunjukkan functiondefinisi, sehingga Anda tidak perlu mengurai jika itu yang Anda inginkan.
ribamar
5
set | sed -n '/^foobar ()/,/^}/p'

Ini pada dasarnya mencetak garis-garis dari perintah set Anda mulai dengan nama fungsi foobar () dan diakhiri dengan}

Jurgen van der Mark
sumber
4
set | grep -A999 '^foobar ()' | grep -m1 -B999 '^}'

dengan foobar menjadi nama fungsi.

pyroscope
sumber
4
masalah: hanya akan ditampilkan hingga "}" pertama, yang bukan segalanya setiap kali definisi tersebut berisi sarang "{...}" yang memang Bash mengizinkan.
Destiny Architect
1
Bisa juga gagal jika fungsinya berisi di sini-doc / di sini-string yang berisi pola keriting-kurung
Cheetah