Bagaimana cara membuat daftar fungsi yang didefinisikan dalam shell saya?

221

Saya bisa mengetik alias untuk menampilkan daftar semua alias.

Tetapi untuk fungsi, yang bisa saya lakukan adalah grep my .bash_profile.

Itu hanya mendapatkan yang ada di file itu, bukan yang didefinisikan dalam file tambahan atau secara dinamis.

Apakah ada cara yang lebih mudah untuk mengetahui fungsi apa yang saat ini didefinisikan?

Dov
sumber
Kemungkinan duplikat untuk mendapatkan daftar nama fungsi dalam skrip shell
Alastair Irvine
2
@AlastairIrvine Terima kasih untuk nominasi rangkap; Namun, saya menyelesaikannya sebaliknya. Pertanyaan ini secara signifikan memiliki lebih banyak pandangan dan peningkatan, serta pilihan jawaban yang lebih luas; dan jawaban yang diterima pada duplikat yang Anda pilih jelas tidak jelas dan bisa dibilang salah.
tripleee

Jawaban:

271

declare -F

Nama dan definisi fungsi dapat dicantumkan dengan -fopsi ke declareperintah builtin (lihat Bash Builtins). The -Fpilihan untuk declare akan daftar nama fungsi saja (dan opsional file sumber dan nomor baris).

Manual Referensi Bash

Pola Dasar Paul
sumber
1
di GNU bash 4.3.46 (1) -release (x86_64-pc-linux-gnu) -F daftar nama / -f daftar seluruh fungsi
ceph3us
5
Untuk mendapatkan file sumber "opsional" / baris #, tampaknya Anda harus mengaktifkan extdebug ( shopt -s extdebug) DAN menyediakan satu atau lebih nama fungsi ke declare -Fperintah. IOW, declare -Ftidak tidak menyediakan nama file / line # s bahkan ketika extdebug diaktifkan, yang tidak jelas dari dokumentasi, juga bukan sangat intuitif, IMO.
Ron Burk
Lihat jawaban @ user495470 di bawah ini untuk solusi yang lebih baik.
starbeamrainbowlabs
82

Dengan asumsi bash shell:

typeset -f

akan mencantumkan fungsi.

typeset -F

akan mencantumkan hanya nama fungsi.

Randall Bohn
sumber
8
Bash saya v4.1.17 (9) -release mengatakan:Obsolete. See `help declare'.
kevinarpe
5
Masih bagus untuk mengetahui bahwa ini adalah sinonim.
bmacnaughton
62
declare -F

akan memberi Anda nama semua fungsi

type function_name

akan memberi Anda sumber untuk fungsi tertentu

John Lawrence Aspden
sumber
2
Atau cukup gunakan mendeklarasikan -f (huruf kecil) untuk sumbernya
Katastic Voyage
51

declare -F sebenarnya mencetak mendeklarasikan perintah dan bukan hanya nama fungsi:

$ declare -F
declare -f function1
declare -f function2

Anda dapat menggunakan compgen -A functionhanya untuk mencetak nama fungsi:

$ compgen -A function
function1
function2
Lri
sumber
6
compgen -A functionhanya apa yang saya cari.
2
Bagus! Saya ingin alias juga dalam kasus saya ... Anda bisa mendapatkan alias dan fungsi dengancompgen -a -A function
Matt Byrne
+1 dan saya telah menggunakan yang berikut ini untuk menampilkan fungsi pribadi saya saja (di Linux Debian):compgen -A function | grep "^[a-z]\+" | grep -vE "^dequote|^quote|^in_array"
Dmytro Dzyubak
30

typeset sudah usang, silakan gunakan:

declare -f

atau

declare -f function_name

atau

type function_name
Robert
sumber
4
set | grep " ()"

Di tempat grep Anda juga dapat menggunakan fgrep atau hgrep (hgrep adalah favorit pribadi saya, ini grep tetapi ini memberi hasil yang bagus 'grep-ped'.

hgrep dapat ditemukan di sini: ACME Labs hgrep

AtomicKobold
sumber
1
Ini akan mencantumkan fungsi tetapi juga variabel yang memiliki nilai `()`
Alois Mahdal
2
@AloisMahdal Berikut ini salah satu yang bekerja: set | grep " () $" | cut -d' ' -f1. Tapi itu terlalu rumit dibandingkan dengan jawaban yang lain.
wjandrea
5
grepbukan solusi yang baik untuk ini, string yang cocok dengan definisi fungsi akan menyebabkan false positive. @wjandrea masih bisa ditangkap oleh multi-string, seperti regex apa pun.
Matt
1

Saya bukan ahli dalam hal ini, masih belajar, tetapi setelah menemukan pertanyaan ini dan jawabannya karena saya menginginkan hal yang sama, saya menulis yang berikut (berdasarkan pada " The Archetypal Paul's decong ") untuk memberi saya akhirnya apa yang saya cari: daftar alias dan fungsi yang diformat:

function functionaliaslist() {
    echo
    echo -e "\033[1;4;32m""Functions:""\033[0;34m"
    declare -F | awk {'print $3'}
    echo
    echo -e "\033[1;4;32m""Aliases:""\033[0;34m"
    alias | awk {'print $2'} | awk -F= {'print $1'}
    echo
    echo -e "\033[0m"
}

Itu sebelum saya melihat jawaban Lri , dan memperkirakan itu, saya mengganti baris declaredan aliasdengan compgenperintah yang sesuai , untuk mendapatkan:

function functionaliaslist() {
    echo
    echo -e "\033[1;4;32m""Functions:""\033[0;34m"
    compgen -A function
    echo
    echo -e "\033[1;4;32m""Aliases:""\033[0;34m"
    compgen -A alias
    echo
    echo -e "\033[0m"
}

Woks memperlakukan untuk apa yang saya inginkan. Berbagi jika itu membantu orang lain.

Ada banyak "tindakan" lain yang tersedia untuk compgen -A [action](dan opsi lain compgententu saja). Saya menemukan artikel yang bagus di sini yang juga menyertakan tautan ke halaman manual (karena man compgentidak berfungsi dalam beberapa kasus).

DavidT
sumber