typeset -f
mengembalikan fungsi dengan badannya, jadi skrip awk sederhana digunakan untuk mencabut nama fungsi
f1 () { :; }
f2 () { :; }
f3 () { :; }
f4 () { :; }
help () {
echo "functions available:"
typeset -f | awk '/ \(\) $/ && !/^main / {print $1}'
}
main () { help; }
main
Skrip ini menghasilkan:
functions available:
f1
f2
f3
f4
help
Anda memanggil fungsi ini tanpa argumen dan hanya mengeluarkan daftar nama fungsi yang dipisahkan "spasi putih".
function script.functions () {
local fncs=`declare -F -p | cut -d " " -f 3`; # Get function list
echo $fncs; # not quoted here to create shell "argument list" of funcs.
}
Untuk memuat fungsi ke dalam larik:
declare MyVar=($(script.functions));
Tentu saja, akal sehat mengatakan bahwa fungsi apa pun yang belum dimasukkan ke dalam file saat ini sebelum pemanggilan ini tidak akan muncul dalam daftar.
Untuk Membuat daftar hanya-baca dan tersedia untuk diekspor ke skrip lain yang dipanggil oleh skrip ini:
declare -rx MyVar=($(script.functions));
Untuk mencetak seluruh daftar sebagai baris baru yang dipisahkan:
printf "%s\n" "${MyVar[@]}";
Anda bisa mendapatkan daftar fungsi dalam skrip Anda dengan menggunakan perintah grep pada skrip Anda sendiri. Agar pendekatan ini berhasil, Anda perlu menyusun fungsi Anda dengan cara tertentu sehingga grep dapat menemukannya. Ini contohnya:
$ cat my.sh
#!/bin/sh
function func1() # Short description
{
echo func1 parameters: $1 $2
}
function func2() # Short description
{
echo func2 parameters: $1 $2
}
function help() # Show a list of functions
{
grep "^function" $0
}
if [ "_$1" = "_" ]; then
help
else
"[email protected]"
fi
Ini adalah demo interaktif:
$ my.sh
function func1() # Short description
function func2() # Short description
function help() # Show a list of functions
$ my.sh help
function func1() # Short description
function func2() # Short description
function help() # Show a list of functions
$ my.sh func1 a b
func1 parameters: a b
$ my.sh func2 x y
func2 parameters: x y
Jika Anda memiliki fungsi "pribadi" yang tidak ingin Anda tampilkan di bantuan, hilangkan bagian "fungsi":
my_private_function()
{
# Do something
}
Hal terbaik untuk dilakukan adalah membuat larik (Anda menggunakan bash) yang berisi fungsi yang ingin Anda iklankan dan membuat fungsi bantuan Anda mengulang dan mencetaknya.
Memanggil set
sendiri akan menghasilkan fungsi, tetapi secara keseluruhan. Anda masih harus mengurai mencari hal-hal yang diakhiri dengan () untuk mendapatkan simbol pepatah .
Mungkin juga lebih waras untuk menggunakan sesuatu seperti getopt
untuk mengubah --function-name
ke dalam function_name
dengan argumen. Tapi, waras itu relatif dan Anda belum memposting kode :)
Pilihan Anda yang lain adalah membuat bash yang dapat dimuat (garpu dari set
) yang menyelesaikan ini. Sejujurnya, saya lebih suka menggunakan penguraian sebelum menulis yang dapat dimuat untuk tugas ini.