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

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

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.


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.


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!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.