Je me suis toujours demandé pourquoi cd
n'était pas un programme, mais je n'ai jamais réussi à trouver la réponse.
Quelqu'un sait pourquoi c'est le cas?
La commande cd
modifie le "répertoire de travail courant", non?
"répertoire de travail actuel" est une propriété unique à chaque processus.
Donc, si cd
était un programme, cela fonctionnerait comme ceci:
cd foo
cd
démarrecd
change le répertoire pour le processus cdcd
se terminecd
en plus d'être un shell intégré, est en fait aussi un programme sur les OS compatibles POSIX. Ils doivent fournir des exécutables indépendants pour les utilitaires classiques, comme cd
. C'est par exemple le cas avec Solaris , AIX , HP-UX et OS X .
De toute évidence, un cd
intégré est toujours obligatoire car son implémentation externe ne change pas le répertoire Shell actuel. Cependant, ce dernier peut toujours être utile. Voici un exemple montrant comment POSIX envisage comment cette commande cd
pourrait être utilisée:
find . -type d -exec cd {} \;
Sur un système POSIX, cet oneliner affichera un message d'erreur pour tous les répertoires dans lesquels vous n'êtes pas autorisé à cd
. Sur la plupart des distributions Gnu/Linux, il échoue cependant avec ce message d'erreur:
find: `cd': No such file or directory
Et voici la réponse à votre question, " Pourquoi le cd n'est-il pas un programme?" par l'un des co-auteurs Unix d'origine. Sur une implémentation Unix très précoce, cd
(épelé chdir
à l'époque) était un programme externe. Il a juste cessé de fonctionner de manière inattendue après la première implémentation de fork
.
Citant Dennis Ritchie:
Au milieu de notre jubilation, il a été découvert que la commande chdir (changer le répertoire courant) avait cessé de fonctionner. Il y avait beaucoup de lecture de code et une introspection inquiète sur la façon dont l'ajout de fork aurait pu interrompre l'appel chdir. Enfin, la vérité est apparue: dans l'ancien système, chdir était un commandement ordinaire; il a ajusté le répertoire courant du processus (unique) attaché au terminal. Sous le nouveau système, la commande chdir a correctement modifié le répertoire actuel du processus créé pour l'exécuter, mais ce processus s'est rapidement terminé et n'a eu aucun effet sur son shell parent! Il fallait faire de chdir une commande spéciale, exécutée en interne au sein du Shell. Il s'avère que plusieurs fonctions de type commande ont la même propriété, par exemple login.
Source: Dennis M. Ritchie, " The Evolution of the Unix Time-sharing System ", AT&T Bell Laboratories Technical Journal 63 (6), Partie 2, oct. 1984, p. 1577–93
Unix Version 1 (mars 1971) chdir page de manuel déclare:
Parce qu'un nouveau processus est créé pour exécuter chaque commande, chdir serait inefficace s'il était écrit comme une commande normale. Il est donc reconnu et exécuté par le Shell.
De l'introduction de Bash ( Qu'est-ce qu'un shell? ):
Les shells fournissent également un petit ensemble de commandes intégrées (intégrées) mettant en œuvre des fonctionnalités impossibles ou peu pratiques à obtenir via des utilitaires distincts. Par exemple,
cd
,break
,continue
etexec
) ne peuvent pas être implémentés en dehors du Shell car ils manipulent directement le Shell lui-même. Les modules intégréshistory
,getopts
,kill
oupwd
, entre autres, pourraient être implémentés dans des utilitaires distincts, mais ils sont plus pratiques à utiliser comme intégrés commandes. Tous les éléments internes de Shell sont décrits dans les sections suivantes.
Pour le poisson d'avril de cette année, j'ai écrit ne version autonome de cd
.
Personne n'a eu la blague. Soupir.
Quiconque n'est pas sûr que cd
doit être intégré au shell doit le télécharger, le construire et l'essayer.
Lisez aussi sa page de manuel. :)
La commande cd
dans Shell ne peut pas être un processus distinct car sous Unix il n'y a pas de mécanisme pour changer le répertoire de travail actuel d'un processus différent (pas même le processus parent).
Si cd
était un processus différent, il devrait changer le répertoire de travail actuel de son parent (Shell), ce qui n'est pas possible sous Unix. À la place, cd
est une commande intégrée spéciale. Le shell appelle des fonctions comme chdir()
et fchdir()
en changeant son propre répertoire de travail actuel.
Remarque: le noyau stocke le numéro d'inode du répertoire de travail actuel pour chaque processus. Le processus enfant hérite de son cwd
de son parent.
cd est une commande intégrée de Shell. Aussi simple que cela. Le cd de l'homme dit tout. la commande cd modifie le répertoire de travail de tous les interprètes et (dans un environnement threadé) tous les threads.