Au début, je cherchais la raison pour laquelle which
rien ne sortait après lui avoir donné certains programmes comme argument, par exemple cd
.
D'après ce que j'ai trouvé ici , la raison en est probablement que cd
sur ma machine est une fonction, qui est confirmée par l'exécution type cd
.
TLDR: Mais comme les programmes normaux qui which
peuvent être localisés grâce aux $PATH
variables sont placés dans un de ces $PATH
dossiers, où sont cd
stockées les fonctions ou les scripts ?
user@linuxmchine:~$ type cd
cd is a function
cd ()
{
__zsh_like_cd cd "$@"
}
linux
bash
shell-script
Gabrijel Šimunović
la source
la source
cd is a shell builtin
. Jetez un oeil à la page de manuel de votre shell (zsh?)Réponses:
Fonctions définies par l'utilisateur
Les fonctions bash sont généralement stockées en permanence dans un
bash
script de démarrage./etc/profile
pour les shells de connexion et/etc/bashrc
pour les shells interactifs.~/.bash_profile
pour les shells de connexion et~/.bashrc
pour les shells interactifs.man
page bash dans la section INVOCATION.Les fonctions shell définies par l'utilisateur sont chargées dynamiquement dans un hachage (ou une table de recherche) au démarrage de bash. A partir du fichier source bash,
variable.c
la définition de la table est:Les fonctions définies par l'utilisateur peuvent être répertoriées avec la
declare
commande bash , d'autres shells utilisent toujourstypeset
. Dans bashdeclare
a remplacé latypeset
commande.Les fonctions existent en mémoire pendant toute la durée de vie du shell bash.
Fonctions définies par le shell (intégrées)
Ce sont des fonctions communes telles que
echo
,printf
,cd
et:
. Ils sont compilés dans une bibliothèque qui est liée à l'bash
exécutable. La construction des définitions dans l'exécutable fait gagner du temps par rapport au chargement d'une définition externe. Les définitions de ces fonctions (conservées dans des.def
fichiers source qui sont analysés dans C source) sont conservées dans lebuiltins
répertoire de bash source.Un côté utile: pour plus d'informations sur l'utilisation d'une commande intégrée au shell
help <command>
. par exemplela source
typeset
ça qui montrerait quel fichier / script a provoqué la création / modification d'une fonction?declare
outypeset
pour afficher le fichier source d'une définition de fonction. Je pense que c'est un problème d'ingénierie logicielle. Récemment trouvé une fonction shell définie dans un.alias
fichier - pas ce que j'attendais!Les fonctions du shell sont stockées dans la mémoire du shell (ou, peut-être, dans des fichiers temporaires non documentés). Ils existent en aucune façon utilisable jusqu'à ce que le début de la coque (par exemple, lorsque vous vous connectez à un CLI, ou ouvrir une fenêtre de shell tels que
xterm
) et ils sont définis (par exemple, en lisant.bashrc
,.bash_profile
ou quelque chose de similaire) et ils cessent de existent lorsque le shell se termine.la source
cd () { pwd; builtin cd "$@"; }
à l'invite, le seul endroit qui est stocké est dans la mémoire de votre shell en cours d'exécution. (Mon exemple est Bash mais le même principe s'applique à n'importe quel shell.)cd
et d'autres commandes courantes telles queecho
,type
&alias
sont appelées des commandes intégrées .Les commandes intégrées sont contenues dans le shell lui-même et différents shells peuvent avoir des commandes intégrées différentes.
la source
cd
est contenu dans le programme shell lui-même, par exemple dans le fichier/bin/bash
si c'est votre shell. (Je pense que votre formulation ici est claire, mais j'ai vu des gens se perdre dans toutes sortes de choses.)La question du super utilisateur Trouver la définition d'une fonction bash est étroitement liée à celle-ci. L'utilisateur HairOfTheDog a fourni cette réponse (paraphrasée):
Ce qui précède peut fonctionner uniquement dans
bash
, et non dans les shells POSIX en général.Merci à Blue Raspberry d' avoir trouvé ça!
la source