Lorsque j'ai créé ma propre shell, je ne suis pas capable d'exécuter la commande CD que je peux faire dans la coquille Linux. Pourquoi est-ce? P>
3 Réponses :
C'est probablement parce que la commande Je ne comprends pas la ligne "Si le répertoire de commande externe modifié, il n'a aucun effet sur la coque mère". P>
blockQuote>
Normalement, lorsqu'un shell exécute une commande, il fait Notez que dans DOS, un fichier CD code> doit être intégrée à la coque, pas quelque chose d'externe et d'exécution. Si une commande externe a modifié le répertoire, il n'a aucun effet sur la coque mère. (Même s'il existe généralement une commande / bin / cd code> ou / usr / bin / cod code> sur les systèmes Linux et MacOS, l'exécution de celui-ci modifie le répertoire de ce processus, mais a aucun effet sur le processus qui l'invoquait.) p>
Fork () code> et le processus enfant utilise exécuté () code> pour exécuter la commande entrée par l'utilisateur. Par exemple, si la commande entrée est ' ls / code>', le shell organise pour exécuter / bin / ls code> avec deux arguments, ls code> et < Code> / code>. Toutefois, si la commande sélectionnée exécute l'appel du système CHDIR () code>, qui affecte le processus d'enfant, mais n'affecte pas la coque mère. Donc, la shell doit gérer la commande CD code> elle-même, non via Fork () code> et exécuté () code>. P>.
.bat code> peut faire cd code> et il affecte le processus cmd.exe code>. Cela ne se produit pas dans UNIX - Un processus enfant ne peut pas affecter le répertoire actuel du processus parent. P>
Merci pour la réponse, mais je n'ai pas compris la ligne "Si le répertoire de commande externe a changé, il n'a aucun effet sur la coque mère".
Unix / Linux et DOS sont les mêmes en ce que chaque processus a son propre répertoire actuel. La différence est que dans DOS, les fichiers BAT (et les fichiers BAT imbriqués) sont exécutés par le processus CMD.EXE actuel, tandis que dans UNIX / Linux, l'exécution d'un script shell démarre un nouveau processus de shell. Dans Unix / Linux, si vous exécutez CD à l'intérieur d'un script, il modifie le répertoire actuel de Shell qui affectera les commandes ultérieures dans le même script. Mais la coquille qui a commencé le script n'est pas affectée.
@Adrian: Vous êtes correct - je me suis demandé s'il faut quitter ce dernier paragraphe ou si cela confondrait l'OP. Votre explication est plus claire que la mienne.
Jonathan Leffler a expliqué pourquoi c'était, mais je voulais offrir une solution de contournement au cas où vous auriez besoin de cette fonctionnalité. Dans Bash (vous n'avez pas spécifié, je suppose donc), la commande Utilisation de ce type de configuration, vous pouvez Modifiez la coque actuelle avec tout ce qui existe dans le script que vous recherchez. Notez que si vous avez dirigé directement «Goproj», cela ne fonctionnerait pas pour le même problème que vous rencontrez déjà; Vous devez l'appeler avec source code> peut être utilisée pour exécuter un script shell dans le processus de shell actuel. J'utilise quelque chose de similaire au ci-dessous (bien que plus complet), ainsi que d'un alias de shell, de modifier les répertoires de projet et de configurer automatiquement l'environnement: source code>. p> p>
Et maintenant que je relis la question, c'était probablement stupide de taper :-) Oh bien.
+1: Ceci est utile lorsque la coquille a mis en place la commande code> CD code> en interne (ainsi que le source code> ou . Code> commande). AFAICT, la question concerne une coquille de brasserie à domicile qui ne met pas implémenter CD code> (via l'appel de système CHDIR () code> appel), et donc aucune quantité d'approvisionnement ne permettra de changer le répertoire jusqu'à ce qu'il soit.
Oui, j'ai glané que sur mon deuxième passage de mon parseur mental.
Ceci est aussi simple que: p>
CD code> n'est pas une commande. LI>
ul>
Essayez ceci: p>
- où ls code> p>
- où cd code> p>
(voir la différence) p>
-
CD code> est la propriété de la coquille, donc si vous faites une coquille, vous devez prendre en charge CD code>. LI>
ul>
Le voir de cette façon, lorsque LS est exécuté, il doit connaître la PWD. Donc, votre shell personnalisé qui gérerait le répertoire. Donc, c'est la coquille qui doit supporter cd. P>
blockQuote>
Je pense que je me suis fait clairement clairement. P>
Si l'erreur est "Commande introuvable", il peut s'agir de faire quelque chose avec le chemin
code>. Qu'est-ce queecho $ path code> dit?Vous avez créé votre propre shell? Sans une commande code> CD code>? Pourquoi fais-tu ça?