Wenn ich eine Datei habe:
dome.sh
$ls -l dome.sh
-rwxrwxr-x 1 user user 0 Aug 8 11:19 dome.sh
und der Inhalt der Datei ist ähnlich wie:
#!/bin/bash
function() {
'work'
}
another() {
'different work'
}
...
#30 functions later
yetANOTHERfunction () {
'even more work'
}
Wobei "# 30 Funktionen später" bedeutet, dass es 30 eindeutige Zusatzfunktionen gibt
Kann ich alle Funktionen in diesem Skript irgendwie durchlaufen, um sie zu identifizieren?
so etwas wie:
for i in $(get all functions in this file); do
echo $i
done
produzieren:
function
another
...
yetANOTHERfunction
bash
shell-script
bash-scripting
spezticle
quelle
quelle
cut
so:declare -F | cut -d ' ' -f3
.Versuchen:
Erläuterung:
Anstatt die Funktionen selbst zu
bash
analysieren , lassen Sie sie analysieren (mitsource
) und den Inhalt sichern (typeset -f
).Der Aufruf
env -i bash --noprofile --norc
soll verhindernbash
, dass Initialisierungsdateien gelesen werden. Andernfalls erhalten Sie möglicherweise Funktionen, die z~/.bashrc
. B. in definiert sind .typeset -f
Dump alle Funktionen und deren Definitionen. Jede Definition beginnt mit: Funktionsname , Raum ,()
, Raum , Newline .grep
undawk
extrahieren Sie die Funktionsnamen aus diesen Zeilen.Der Grund für den Filter ist, dass Sie möglicherweise falsche Positive erhalten, wenn Sie Funktionen wie:
Hier
while
würde die Schleife fälschlicherweise gedruckta
, aber der Filter kümmert sich darum.Bearbeitet, um Funktionen aus einer Datei zu drucken und Startdateien nicht einzuschließen.
quelle
declare -f
ohne weitere Argumente innerhalb des Skripts aufrufen , um eine Liste der darin enthaltenen Funktionsdefinitionen zu erhalten. Mit anderen Worten, wenn Sie die Zeile declare -f am Ende eines Skripts hinzugefügt und aus einer Shell bezogen haben, werden die Funktionsdefinitionen nur in diesem Skript an das Terminal ausgegeben. Es gibt sowohl den Funktionsnamen als auch den Hauptteil aus. Wenn Sie also nur den Namen wünschen, müssen Sie diese Ausgabe durch sed / grep leiten. In einer realen Anwendung möchten Sie die Funktionsliste wahrscheinlich selektiv basierend auf den Kriterien Ihrer Wahl ( dh Argument).declare
undtypeset
sind der gleiche Befehl. 2) Alle Funktionen Ihrer Shell (nicht unbedingt aus der Datei von Interesse) werden in der Ausgabe angezeigt. Dies ist der zweite Punkt oben.