Où sont stockées les fonctions shell sous Linux?

11

Au début, je cherchais la raison pour laquelle whichrien 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 cdsur ma machine est une fonction, qui est confirmée par l'exécution type cd.

TLDR: Mais comme les programmes normaux qui whichpeuvent être localisés grâce aux $PATHvariables sont placés dans un de ces $PATHdossiers, où sont cdstockées les fonctions ou les scripts ?

user@linuxmchine:~$ type cd
cd is a function
cd () 
{ 
    __zsh_like_cd cd "$@"
}
Gabrijel Šimunović
la source
Je comprends cd is a shell builtin. Jetez un oeil à la page de manuel de votre shell (zsh?)
Xen2050
1
Consultez unix.stackexchange.com/questions/85249/… Le problème est celui qui est une commande héritée qui ne devrait pas être utilisée - en particulier à cause de choses comme cette question.
Joe

Réponses:

12

Fonctions définies par l'utilisateur

Les fonctions bash sont généralement stockées en permanence dans un bashscript de démarrage.

  • Scripts de démarrage à l'échelle du système: /etc/profilepour les shells de connexion et /etc/bashrcpour les shells interactifs.
  • Les scripts de démarrage définis par l'utilisateur: ~/.bash_profilepour les shells de connexion et ~/.bashrcpour les shells interactifs.
  • Plus d'informations sur les shells interactifs / de connexion peuvent être trouvées dans la manpage 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.cla définition de la table est:

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

Les fonctions définies par l'utilisateur peuvent être répertoriées avec la declarecommande bash , d'autres shells utilisent toujours typeset. Dans bash declarea remplacé la typesetcommande.

declare -f

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, cdet :. Ils sont compilés dans une bibliothèque qui est liée à l' bashexé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 .deffichiers source qui sont analysés dans C source) sont conservées dans le builtinsré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 exemple

help                # list all builtins
help declare        # info and options for declare
help -m declare     # gives man style information for declare
suspect
la source
Merci pour cette réponse d'extrait. C'est exactement ce que je cherchais. Pensez-vous qu'il existe un outil pour suivre le processus de création de fonctions bash ou quelque chose comme typesetça qui montrerait quel fichier / script a provoqué la création / modification d'une fonction?
Gabrijel Šimunović
Je ne connais aucun de ces outils - ce serait une option utile pour la commande declareou typesetpour 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 .aliasfichier - pas ce que j'attendais!
suspectus
8

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_profileou quelque chose de similaire) et ils cessent de existent lorsque le shell se termine.

G-Man dit «Réintègre Monica»
la source
1
La nature éphémère de quelque chose que vous tapez à l'invite est importante. Mon vote va à cette réponse. Si vous tapez 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.)
tripleee
6

cdet d'autres commandes courantes telles que echo, type& aliassont 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.

Nifle
la source
4
Je ne sais pas s'il vaut la peine de souligner que le code exécutable pour les commandes intégrées comme cdest contenu dans le programme shell lui-même, par exemple dans le fichier /bin/bashsi 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.)
David Z
1

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):

Les commandes suivantes indiqueront l'emplacement (nom de fichier et numéro de ligne) de la définition d'une fonction. En supposant une fonction nommée 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

Par exemple, la sortie de ces commandes peut être:

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

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!

G-Man
la source