Jak wyświetlić listę funkcji zdefiniowanych w mojej powłoce?

223

Mogę wpisać alias, aby wyświetlić listę wszystkich aliasów.

Ale w przypadku funkcji wszystko, co mogę zrobić, to grep my .bash_profile.

To tylko pobiera te z tego pliku, a nie te zdefiniowane w plikach pomocniczych lub dynamicznie.

Czy istnieje wygodniejszy sposób, aby dowiedzieć się, jakie funkcje są obecnie zdefiniowane?

Dow
źródło
Możliwy duplikat uzyskania listy nazw funkcji w skrypcie powłoki
Alastair Irvine
2
@AlastairIrvine Dzięki za podwójną nominację; jednak rozwiązałem to na odwrót. To pytanie ma znacznie więcej poglądów i pozytywnych opinii, a także szerszy wybór odpowiedzi; a zaakceptowana odpowiedź na wskazany przez Ciebie duplikat jest zdecydowanie niejasna i prawdopodobnie po prostu błędna.
tripleee

Odpowiedzi:

273

declare -F

Nazwy funkcji i definicje mogą być wyświetlane wraz z -fopcją declarewbudowanego polecenia (zobacz Wbudowane Bash). -FOpcja declare będzie lista nazw funkcji tylko (i opcjonalnie plik źródłowy i numer linii).

Podręcznik referencyjny Bash

Archetypalny Paweł
źródło
1
w GNU bash 4.3.46 (1) -release (x86_64-pc-linux-gnu) -F wyświetla nazwy / -f wyświetla całą funkcję
ceph3us
5
Aby uzyskać „opcjonalny” plik źródłowy / wiersz #, wydaje się, że musisz włączyć extdebug ( shopt -s extdebug) ORAZ podać jedną lub więcej nazw funkcji dla declare -Fpolecenia. IOW, declare -Fczy nie dostarczy nazw / linia # y nawet gdy extdebug jest włączona, który nie wynika z dokumentacji, ani nie jest szczególnie intuicyjne, IMO.
Ron Burk
Aby uzyskać lepsze rozwiązanie, patrz odpowiedź @ user495470 poniżej.
starbeamrainbowlabs,
82

Zakładając powłokę bash:

typeset -f

wyświetli listę funkcji.

typeset -F

wyświetli tylko nazwy funkcji.

Randall Bohn
źródło
8
Moja wersja bash v4.1.17 (9) -release mówi:Obsolete. See `help declare'.
kevinarpe
5
Wciąż miło wiedzieć, że to synonim.
bmacnaughton,
62
declare -F

poda ci nazwy wszystkich funkcji

type function_name

poda źródło konkretnej funkcji

John Lawrence Aspden
źródło
2
Lub po prostu użyj deklaruj -f (małe litery) dla źródła
Katastic Voyage
51

declare -F faktycznie drukuje deklaracje poleceń, a nie tylko nazwy funkcji:

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

Możesz użyć compgen -A functiondo drukowania tylko nazw funkcji:

$ compgen -A function
function1
function2
Lri
źródło
6
compgen -A functionbyło właśnie tym, czego szukałem.
2
Miły! Chciałem również aliasów w moim przypadku ... możesz uzyskać zarówno aliasy, jak i funkcjecompgen -a -A function
Matt Byrne
+1 i wykorzystałem następujące dane do wyświetlania tylko moich funkcji osobistych (w systemie Linux Debian):compgen -A function | grep "^[a-z]\+" | grep -vE "^dequote|^quote|^in_array"
Dmytro Dzyubak
30

skład jest przestarzały, użyj:

declare -f

lub

declare -f function_name

lub

type function_name
Robert
źródło
4
set | grep " ()"

Zamiast grep możesz także użyć fgrep lub hgrep (hgrep to mój osobisty faworyt, to grep, ale hi-lites wynik grep-ped.

hgrep można znaleźć tutaj: ACME Labs hgrep

AtomicKobold
źródło
1
Spowoduje to wyświetlenie funkcji, ale także zmiennych, które mają wartość `()`
Alois Mahdal
2
@AloisMahdal Oto jeden, który działa: set | grep " () $" | cut -d' ' -f1. Ale jest to zbyt skomplikowane w porównaniu do innych odpowiedzi.
wjandrea,
5
grepnie jest dobrym rozwiązaniem, ciągi pasujące do definicji funkcji spowodują fałszywe alarmy. @wjandrea nadal może być przechwycony przez ciągi wieloliniowe, podobnie jak każde wyrażenie regularne.
Matt
1

Nie jestem w tym ekspertem, wciąż się uczę, ale po znalezieniu tego pytania i odpowiedzi, ponieważ chciałem tego samego, napisałem następujące (w oparciu o odpowiedź „ Deklaracja Archetypalnego Pawła ”), aby dać mi ostatecznie to, czego chciałem: sformatowana lista aliasów i funkcji:

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"
}

To było przed Widziałem odpowiedź LRI za , a więc z ekstrapolacji, że mogę wymienić declarei aliaslinie z odpowiednich compgenpoleceń zamiast dostać:

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 przysmak za to, czego chciałem. Udostępnianie na wypadek, gdyby pomógł komukolwiek innemu.

Istnieje wiele innych „akcji” dostępnych dla compgen -A [action](i compgenoczywiście inne opcje ). Znalazłem tutaj dobry opis , który zawiera również link do strony man (ponieważ man compgenw niektórych przypadkach nie działa).

DavidT
źródło