Zuerst habe ich nach dem Grund gesucht, which
der 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 cd
auf meinem Computer eine Funktion vorhanden ist, die durch Ausführen bestätigt wird type cd
.
TLDR: Aber wie normale Programme, which
die dank der $PATH
Variablen gefunden werden können, werden sie in einem dieser $PATH
Ordner cd
abgelegt. Wo werden Funktionen oder Skripte wie gespeichert?
user@linuxmchine:~$ type cd
cd is a function
cd ()
{
__zsh_like_cd cd "$@"
}
linux
bash
shell-script
Gabrijel Šimunović
quelle
quelle
cd is a shell builtin
.Antworten:
Benutzerdefinierte Funktionen
Typischerweise werden Bash-Funktionen permanent in einem Startskript gespeichert
bash
./etc/profile
für Login-Shells und/etc/bashrc
für interaktive Shells.~/.bash_profile
für Login-Shells und~/.bashrc
für interaktive Shells.man
Seite im Abschnitt INVOCATION.Benutzerdefinierte Shell-Funktionen werden dynamisch in einen Hash (oder eine Nachschlagetabelle) geladen, wenn die Bash startet. Aus der Bash-Quelldatei
variable.c
ergibt sich folgende Definition für die Tabelle:Benutzerdefinierte Funktionen können mit dem
declare
Befehl bash aufgelistet werden , andere Shells verwenden sie weiterhintypeset
. In Bashdeclare
hat dentypeset
Befehl abgelöst.Die Funktionen sind für die Lebensdauer der Bash-Shell im Speicher vorhanden.
Shell-definierte (eingebaute) Funktionen
Dies sind allgemeine Funktionen wie
echo
,printf
,cd
und:
. Sie werden in eine Bibliothek kompiliert, die mit derbash
ausfü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.def
Quelldateien enthalten, die in C-Quelldateien geparst werden) werden imbuiltins
Verzeichnis der Bash-Quelle gespeichert .Eine nützliche Seite: Für Informationen über einen Shell-Builtin-Befehl verwenden
help <command>
. z.Bquelle
typeset
würde zeigen, welche Datei / welches Skript die Erstellung / Änderung einer Funktion verursacht hat?declare
odertypeset
, um die Quelldatei einer Funktionsdefinition anzuzeigen. Ich denke, es ist ein Software-Engineering-Problem. Kürzlich wurde eine Shell-Funktion in einer.alias
Datei definiert - nicht das, was ich erwartet hatte!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_profile
oder so ähnlich) und sie aufhören zu Existiert, wenn die Shell beendet wird.quelle
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.)cd
und andere häufig verwendete Befehle wieecho
,type
undalias
werden so genannt , builtins .Eingebaute Befehle sind in der Shell selbst enthalten, und in verschiedenen Shells können unterschiedliche Befehle eingebaut sein.
quelle
cd
im Shell-Programm selbst enthalten ist, z. B. in der Datei,/bin/bash
wenn 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.)Die Super-User-Frage Das Finden der Definition einer Bash-Funktion hängt eng mit dieser zusammen. Der Benutzer HairOfTheDog gab diese Antwort (umschrieben):
Das oben Genannte funktioniert möglicherweise nur
bash
in POSIX-Shells und nicht generell in POSIX-Shells.Vielen Dank an Blue Raspberry für das Auffinden!
quelle