Je me suis toujours demandé pourquoi ce 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?
shell
command
cd-command
shell-builtin
AkshaiShah
la source
la source
cd
commande unix originale était un programme séparé. La coque traitée spécialement en ce qu'elle n'a pasfork
, justeexec
. Et quand cecd
serait fini, ça serait execsh
. Je ne sais pas si c'est une histoire vraie.chdir
syscall. sources: v1 v5 v7 (première version avec Bourne Shell)cd
ce sujet que j'avais lue. J'avais clairement tort à propos de l'aspect, maintenant que @jlliagre a rempli les détails.Réponses:
La
cd
commande modifie le "répertoire de travail en cours", non?"Répertoire de travail en cours" est une propriété unique pour chaque processus.
Donc, si
cd
c'était un programme ça marcherait comme ça:cd foo
cd
processus commencecd
processus change le répertoire pour le processus cdcd
processus se terminela source
cd
s'agissait d'un programme, il fonctionnerait comme ceci" devrait être "lorsqu'ilcd
est utilisé dans sa mise en œuvre de programme externe, cela fonctionne comme cela".cd
En plus d'être un shell intégré, c'est aussi un programme sur les systèmes d'exploitation compatibles POSIX. Ils doivent fournir des exécutables indépendants pour les utilitaires habituels, tels quecd
. Ceci est par exemple le cas avec Solaris , AIX , HP-UX et OS X .De toute évidence, une commande intégrée
cd
est toujours obligatoire car son implémentation externe ne modifie pas le répertoire shell en cours. Cependant, ce dernier peut toujours être utile. Voici un exemple montrant comment POSIX envisage l'utilisation de cettecd
commande:Sur un système POSIX, cet oneliner signalera un message d'erreur pour tous les répertoires non autorisés
cd
. Sur la plupart des distributions Gnu / Linux, le message d'erreur suivant s'affiche:Et voici la réponse à votre question, " Pourquoi le CD n'est-il pas un programme? " De l'un des co-auteurs Unix d'origine. Sur une version très tôt Unix,
cd
(orthographiéchdir
à cette époque) était un programme externe. Il a simplement cessé de fonctionner de manière inattendue aprèsfork
sa première mise en œuvre.Citant Dennis Ritchie :
Source: Dennis M. Ritchie, « L’évolution du système de partage du temps Unix », Revue technique des laboratoires AT & T Bell 63 (6), Partie 2, octobre 1984, p. 1577–93.
Unix Version 1 (Mars 1971) La page de manuel chdir indique:
Comme un nouveau processus est créé pour exécuter chaque commande, chdir serait inefficace s’il était écrit en tant que commande normale. Il est donc reconnu et exécuté par Shell.
la source
cd
exécutable indépendant , mais qu’il ne fasse rien (sauf éventuellement émettre des messages d’erreur s’il est appelé avec de mauvais arguments). Bizarre.De l'introduction Bash ( Qu'est-ce qu'un shell? ):
la source
Pour April Fool, cette année, j’ai écrit une version autonome de
cd
.Personne n'a la blague. Soupir.
Quiconque n’est pas sûr que cela
cd
doit être intégré au shell devrait le télécharger, le construire et l’essayer.Lisez aussi sa page de manuel. :)
la source
/bin/cd
. Si vous voulez prendre mon code et en faire votre propre quête personnelle, vous pouvez le faire.La
cd
commande en shell ne peut pas être un processus séparé car sous Unix, il n’existe aucun mécanisme permettant de modifier le répertoire de travail actuel d’un processus différent (pas même le processus parent).S'il
cd
s'agissait d'un processus différent, il devrait alors modifier le répertoire de travail actuel de son parent (shell), ce qui n'est pas possible sous Unix. Au lieu de celacd
est une commande intégrée spéciale. Les appels de shell fonctionnent commechdir()
etfchdir()
changent 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
cwd
de son parent.la source
cd est une commande intégrée du shell. Aussi facile que ça. L'homme cd dit tout. la commande cd modifie le répertoire de travail de tous les interprètes et (dans un environnement threadé) de tous les threads.
la source
cd
intégrée. Je vous suggérerais de lire les réponses les mieux classées et de réfléchir à la manière d'améliorer votre réponse.Je pense qu’une chose qui manque à la réponse des gens est que le répertoire courant est une variable d’environnement que chaque programme peut changer. Si vous utilisez la commande 'export' pour voir la liste de vos variables d'environnement actuelles, vous aurez:
dans vos résultats. Ainsi, par la commande 'cd', nous voulons simplement modifier cette variable interne. Je pense que si nous essayons, nous pouvons modifier la variable PWD de n’importe quel pty en shell, bien sûr. Comme:
Mais je pense qu’il n’est pas nécessaire dans les cas normaux. En un autre mot, nous prenons l’aide de bash (ou n’importe quel shell) pour modifier sa variable interne définie.
la source
..
chemin, pas le chemin que vous avez commencé à partir de :#include <stdlib.h>
int main(void) { chdir(".."); puts(getenv("PWD")); }
(C shells exposent l'encéphalopathie des cervidés en% au lieu CWD, en passant.)#include <unistd.h>
int main(void) { char ac[99]; setenv("PWD", "/", 1); puts(getcwd(ac, sizeof(ac))); }
Il montrera le répertoire à partir duquel vous avez commencé le programme, pas/
.$PWD
n'a de sens que pour le shell Bourne. C'est juste un moyen pour le shell de communiquer quelque chose qu'il sait à ses scripts afin qu'ils n'aient pas à appelerpwd
pour le trouver. Tout programme autonome dépendant de la valeur de$PWD
sera peu fiable.