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"

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'

2
@ sjsupersumit Pertanyaan secara eksplisit meminta solusi Bash.
bfontaine

210

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

declare -f foobar

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}


4
set | grep -A999 '^foobar ()' | grep -m1 -B999 '^}'

dengan foobar menjadi nama fungsi.


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
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.