Wo werden Shell-Funktionen unter Linux gespeichert?

11

Zuerst habe ich nach dem Grund gesucht, whichder nichts ausgibt, nachdem er bestimmte Programme als Argument angegeben hat, z cd.

Nach dem, was ich hier gefunden habe , liegt der Grund wahrscheinlich darin, dass cdauf meinem Computer eine Funktion vorhanden ist, die durch Ausführen bestätigt wird type cd.

TLDR: Aber wie normale Programme, whichdie dank der $PATHVariablen gefunden werden können, werden sie in einem dieser $PATHOrdner cdabgelegt. Wo werden Funktionen oder Skripte wie gespeichert?

user@linuxmchine:~$ type cd
cd is a function
cd () 
{ 
    __zsh_like_cd cd "$@"
}
Gabrijel Šimunović
quelle
Ich verstehe cd is a shell builtin.
Werfen
1
Schauen Sie sich unix.stackexchange.com/questions/85249/… an. Das Problem ist, dass es sich um einen Legacy-Befehl handelt, der nicht verwendet werden sollte - insbesondere aufgrund solcher Fragen.
Joe

Antworten:

12

Benutzerdefinierte Funktionen

Typischerweise werden Bash-Funktionen permanent in einem Startskript gespeichert bash.

  • Systemweite Startskripte: /etc/profilefür Login-Shells und /etc/bashrcfür interaktive Shells.
  • Benutzerdefinierte Startskripte: ~/.bash_profilefür Login-Shells und ~/.bashrcfür interaktive Shells.
  • Weitere Informationen zu interaktiven / Login-Shells finden Sie auf der Bash- manSeite im Abschnitt INVOCATION.

Benutzerdefinierte Shell-Funktionen werden dynamisch in einen Hash (oder eine Nachschlagetabelle) geladen, wenn die Bash startet. Aus der Bash-Quelldatei variable.cergibt sich folgende Definition für die Tabelle:

/* The list of shell functions that the user has created, or that came from
   the environment. */
HASH_TABLE *shell_functions = (HASH_TABLE *)NULL;

Benutzerdefinierte Funktionen können mit dem declareBefehl bash aufgelistet werden , andere Shells verwenden sie weiterhin typeset. In Bash declarehat den typesetBefehl abgelöst.

declare -f

Die Funktionen sind für die Lebensdauer der Bash-Shell im Speicher vorhanden.

Shell-definierte (eingebaute) Funktionen

Dies sind allgemeine Funktionen wie echo, printf, cdund :. Sie werden in eine Bibliothek kompiliert, die mit der bashausführbaren Datei verknüpft ist . Das Einfügen der Definitionen in die ausführbare Datei spart Zeit im Vergleich zum Laden einer externen Definition. Definitionen für diese Funktionen (in .defQuelldateien enthalten, die in C-Quelldateien geparst werden) werden im builtinsVerzeichnis der Bash-Quelle gespeichert .

Eine nützliche Seite: Für Informationen über einen Shell-Builtin-Befehl verwenden help <command>. z.B

help                # list all builtins
help declare        # info and options for declare
help -m declare     # gives man style information for declare
Verdächtiger
quelle
Vielen Dank für diese auszugsweise Antwort. Genau das habe ich gesucht. Glauben Sie, es gibt ein Tool, mit dem Sie den Erstellungsprozess von Bash-Funktionen verfolgen können, oder so etwas typesetwürde zeigen, welche Datei / welches Skript die Erstellung / Änderung einer Funktion verursacht hat?
Gabrijel Šimunović
Ich kenne kein solches Tool - es wäre eine nützliche Option für den Befehl declareoder typeset, um die Quelldatei einer Funktionsdefinition anzuzeigen. Ich denke, es ist ein Software-Engineering-Problem. Kürzlich wurde eine Shell-Funktion in einer .aliasDatei definiert - nicht das, was ich erwartet hatte!
suspectus
8

Shell- Funktionen werden im Speicher der Shell gespeichert (oder möglicherweise in nicht dokumentierten temporären Dateien). Sie existieren nicht in irgendeiner Art und Weise verwendbar , bis die Schale beginnt (zB wenn Sie sich einloggen , um einen CLI oder ein Shell - Fenster starten, wie xterm) , und sie definiert sind (zB durch das Lesen .bashrc, .bash_profileoder so ähnlich) und sie aufhören zu Existiert, wenn die Shell beendet wird.

G-Man
quelle
1
Die vergängliche Natur von etwas, das Sie nach Aufforderung eingeben, ist wichtig. Meine Stimme geht auf diese Antwort. Wenn Sie cd () { pwd; builtin cd "$@"; }an der Eingabeaufforderung eingeben, wird nur der Speicherort der aktuell ausgeführten Shell gespeichert. (Mein Beispiel ist Bash, aber das gleiche Prinzip gilt für jede Shell.)
Tripleee
6

cdund andere häufig verwendete Befehle wie echo, typeund aliaswerden so genannt , builtins .

Eingebaute Befehle sind in der Shell selbst enthalten, und in verschiedenen Shells können unterschiedliche Befehle eingebaut sein.

Nifle
quelle
4
Ich weiß nicht, ob es sich lohnt, darauf hinzuweisen, dass der ausführbare Code für eingebaute Befehle wie cdim Shell-Programm selbst enthalten ist, z. B. in der Datei, /bin/bashwenn dies Ihre Shell ist. (Ich denke, Ihre Formulierung hier ist klar, aber ich habe gesehen, wie die Leute durch alle möglichen Dinge verwirrt wurden.)
David Z
1

Die Super-User-Frage Das Finden der Definition einer Bash-Funktion hängt eng mit dieser zusammen. Der Benutzer HairOfTheDog gab diese Antwort (umschrieben):

Die folgenden Befehle geben die Position (Dateiname und Zeilennummer) einer Funktionsdefinition an. Angenommen, eine Funktion mit dem Namen foo,

# Turn on extended shell debugging
shopt -s extdebug

# Display the function’s name, line number and fully qualified source file
declare -F foo

# Turn off extended shell debugging
shopt -u extdebug

Die Ausgabe dieser Befehle könnte beispielsweise sein:

foo 32 /source/private/main/developer/cue.pub.sh

Das oben Genannte funktioniert möglicherweise nur bashin POSIX-Shells und nicht generell in POSIX-Shells.

Vielen Dank an Blue Raspberry für das Auffinden!

G-Man
quelle