Come posso elencare le funzioni definite nella mia shell?


221

Posso digitare l'alias per mostrare un elenco di tutti gli alias.

Ma per le funzioni, tutto ciò che posso fare è grep my .bash_profile.

Ciò ottiene solo quelli in quel file, non quelli definiti in file sussidiari o dinamicamente.

Esiste un modo più conveniente per scoprire quali funzioni sono attualmente definite?



2
@AlastairIrvine Grazie per la duplice nomina; tuttavia, l'ho risolto al contrario. Questa domanda ha molte più opinioni e valutazioni, oltre a una più ampia selezione di risposte; e la risposta accettata sul tuo duplicato nominato è decisamente oscura e probabilmente solo sbagliata.
Tripleee

Risposte:


271

declare -F

I nomi e le definizioni delle funzioni possono essere elencati con l' -fopzione al declarecomando incorporato (vedere Bash Builtins). L' -Fopzione to declare elencherà solo i nomi delle funzioni (e facoltativamente il file sorgente e il numero di riga).

Manuale di riferimento di Bash


1
in GNU bash 4.3.46 (1) -release (x86_64-pc-linux-gnu) -F elenca i nomi / -f elenca l'intera funzione
ceph3us

5
Per ottenere il file / riga # "sorgente" opzionale, sembra che sia necessario abilitare extdebug ( shopt -s extdebug) E fornire uno o più nomi di funzioni al declare -Fcomando. IOW, declare -Fnon non fornisce nomi / riga # s anche quando extdebug è attivata, non è chiaro dalla documentazione, né è particolarmente intuitivo, IMO.
Ron Burk,

Vedi la risposta di @ user495470 di seguito per una soluzione migliore.
Starbeamrainbowlabs

82

Supponendo bash shell:

typeset -f

elencherà le funzioni.

typeset -F

elencherà solo i nomi delle funzioni.


8
Il mio rilascio di bash v4.1.17 (9) dice:Obsolete. See `help declare'.
kevinarpe l'

5
È comunque bello sapere che è un sinonimo.
bmacnaughton,

62
declare -F

ti darà i nomi di tutte le funzioni

type function_name

ti darà la fonte per una particolare funzione


2
O semplicemente usa declare -f (lettere minuscole) per l'origine
Katastic Voyage

51

declare -F in realtà stampa i comandi di dichiarazione e non solo i nomi delle funzioni:

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

È possibile utilizzare compgen -A functionper stampare solo i nomi delle funzioni:

$ compgen -A function
function1
function2

6
compgen -A functionera proprio quello che stavo cercando.

2
Bello! Volevo anche degli alias nel mio caso ... puoi ottenere sia gli alias che le funzioni concompgen -a -A function
Matt Byrne,

+1 e ho usato quanto segue per emettere solo le mie funzioni personali (su Linux Debian):compgen -A function | grep "^[a-z]\+" | grep -vE "^dequote|^quote|^in_array"
Dmytro Dzyubak

30

la composizione è obsoleta, si prega di utilizzare:

declare -f

o

declare -f function_name

o

type function_name

4
set | grep " ()"

Al posto di grep puoi anche usare fgrep o hgrep (hgrep è il mio preferito personale, è grep ma hi-lite il risultato 'grep-ped'.

hgrep può essere trovato qui: ACME Labs hgrep


1
Questo elencherà le funzioni ma anche le variabili che hanno `()` in valore
Alois Mahdal

2
@AloisMahdal Ecco quello che funziona: set | grep " () $" | cut -d' ' -f1. Ma è eccessivamente complicato rispetto alle altre risposte.
wjandrea,

5
grepnon è una buona soluzione per questo, le stringhe che corrispondono alle definizioni delle funzioni causeranno falsi positivi. @wjandrea può ancora essere catturato da stringhe multilinea, così come qualsiasi regex.
Matt

1

Non sono esperto in questo, sto ancora imparando, ma dopo aver trovato questa domanda e la sua risposta perché volevo lo stesso, ho scritto quanto segue (basato sulla risposta " La dichiarazione dell'archetipo Paolo ") per darmi alla fine quello che stavo cercando: un elenco formattato di entrambi gli alias e le funzioni:

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

Questo è stato prima che vedessi la risposta di Lri , e così estrapolando da ciò, ho sostituito le righe declaree aliascon i compgencomandi appropriati , per ottenere:

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 una sorpresa per quello che volevo. Condivisione nel caso in cui aiuti chiunque altro.

Ci sono molte altre "azioni" disponibili per compgen -A [action](e altre opzioni compgenovviamente). Ho trovato un buon articolo qui che include anche un link alla pagina man (perché man compgenin alcuni casi non funziona).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.