Wie liste ich die in meiner Shell definierten Funktionen auf?

221

Ich kann einen Alias ​​eingeben, um eine Liste aller Aliase anzuzeigen.

Aber für Funktionen kann ich nur meine grep .bash_profile.

Dadurch werden nur diejenigen in dieser Datei abgerufen, nicht diejenigen, die in untergeordneten Dateien oder dynamisch definiert sind.

Gibt es eine bequemere Möglichkeit, herauszufinden, welche Funktionen derzeit definiert sind?

Dov
quelle
Mögliches Duplikat von eine Liste der Funktionsnamen in einem Shell-Skript erhalten
Alastair Irvine
2
@AlastairIrvine Danke für die doppelte Nominierung; Ich habe es jedoch umgekehrt gelöst. Diese Frage hat deutlich mehr Ansichten und positive Stimmen sowie eine breitere Auswahl an Antworten. und die akzeptierte Antwort auf Ihr nominiertes Duplikat ist entschieden dunkel und wohl einfach falsch.
Tripleee

Antworten:

271

declare -F

Funktionsnamen und Definitionen können mit der -fOption zum declareeingebauten Befehl aufgelistet werden (siehe Bash Builtins). Mit dieser -FOption declare werden nur die Funktionsnamen (und optional die Quelldatei und die Zeilennummer) aufgelistet.

Bash Referenzhandbuch

Der archetypische Paulus
quelle
1
in GNU bash 4.3.46 (1) -release (x86_64-pc-linux-gnu) -F listet Namen / -f listet ganze Funktion auf
ceph3us
5
Um die "optionale" Quelldatei / Zeilennummer zu erhalten, müssen Sie anscheinend extdebug ( shopt -s extdebug) aktivieren UND dem declare -FBefehl einen oder mehrere Funktionsnamen geben . IOW declare -Fliefert keine Dateinamen / Zeilennummern, selbst wenn extdebug aktiviert ist, was weder aus der Dokumentation hervorgeht, noch ist IMO besonders intuitiv.
Ron Burk
Eine bessere Lösung finden Sie in der Antwort von @ user495470 unten.
Starbeamrainbowlabs
82

Angenommen, Bash Shell:

typeset -f

listet die Funktionen auf.

typeset -F

listet nur die Funktionsnamen auf.

Randall Bohn
quelle
8
Meine Bash v4.1.17 (9) -Veröffentlichung sagt:Obsolete. See `help declare'.
Kevinarpe
5
Es ist immer noch schön zu wissen, dass es ein Synonym ist.
Bmacnaughton
62
declare -F

gibt Ihnen die Namen aller Funktionen

type function_name

gibt Ihnen die Quelle für eine bestimmte Funktion

John Lawrence Aspden
quelle
2
Oder verwenden Sie einfach deklarieren -f (Kleinbuchstaben) für die Quelle
Katastic Voyage
51

declare -F druckt tatsächlich Deklarationsbefehle und nicht nur Funktionsnamen:

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

Sie können compgen -A functionnur Funktionsnamen drucken:

$ compgen -A function
function1
function2
Lri
quelle
6
compgen -A functionwar genau das, wonach ich gesucht habe.
2
Nett! Ich wollte auch Aliase in meinem Fall ... Sie können sowohl Aliase als auch Funktionen mitcompgen -a -A function
Matt Byrne
+1 und ich habe Folgendes verwendet, um nur meine persönlichen Funktionen auszugeben (unter Linux Debian):compgen -A function | grep "^[a-z]\+" | grep -vE "^dequote|^quote|^in_array"
Dmytro Dzyubak
30

Satz ist veraltet, bitte verwenden Sie:

declare -f

oder

declare -f function_name

oder

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

Anstelle von grep können Sie auch fgrep oder hgrep verwenden (hgrep ist mein persönlicher Favorit, es ist grep, aber es macht das 'grep-ped'-Ergebnis deutlich.

hgrep finden Sie hier: ACME Labs hgrep

AtomicKobold
quelle
1
Dies listet Funktionen, aber auch Variablen mit dem Wert `()` auf
Alois Mahdal
2
@AloisMahdal Hier ist eine, die funktioniert : set | grep " () $" | cut -d' ' -f1. Aber es ist im Vergleich zu den anderen Antworten zu kompliziert.
Wjandrea
5
grepDies ist keine gute Lösung. Zeichenfolgen, die mit Funktionsdefinitionen übereinstimmen, führen zu Fehlalarmen. @wjandrea kann immer noch von mehrzeiligen Zeichenfolgen abgefangen werden, ebenso wie jeder reguläre Ausdruck.
Matt
1

Ich bin kein Experte in diesem Bereich und lerne noch, aber nachdem ich diese Frage und ihre Antwort gefunden hatte, weil ich dasselbe wollte, schrieb ich Folgendes (basierend auf der Antwort " Die Erklärung des Archetypischen Paulus "), um mir letztendlich das zu geben, wonach ich suchte: eine formatierte Liste von Aliasen und Funktionen:

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

Das war, bevor ich Lris Antwort sah , und so extrapoliere ich daraus, dass ich stattdessen die Zeilen declareund aliasdurch entsprechende compgenBefehle ersetze, um Folgendes zu erhalten:

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 eine Belohnung für das, was ich wollte. Teilen für den Fall, dass es jemand anderem hilft.

Es gibt eine Vielzahl anderer "Aktionen" compgen -A [action](und compgennatürlich auch andere Optionen ). Ich habe hier einen guten Artikel gefunden, der auch einen Link zur Manpage enthält (weil man compgener in einigen Fällen nicht funktioniert).

DavidT
quelle