Quel est le point de la commande `cd` external?

72

Comme indiqué dans cette réponse précise, les systèmes POSIX ont un fichier binaire externe cden plus du shell intégré. Sur OS X 10.8 c'est /usr/bin/cd. Vous ne pouvez pas l'utiliser comme le programme intégré cdcar il se ferme immédiatement après la modification de son propre répertoire de travail. A quoi est-ce que ça sert?

kojiro
la source
Notez qu'Ubuntu et CentOS (et donc vraisemblablement Red Hat) n'en ont pas /usr/bin/cd, seulement le shell intégré.
Keith Thompson
1
Mon Fedora 19 comprend /bin/cdcependant.
slm
1
Debian (j'ai vérifié plusieurs versions, y compris les tests actuels) n'a ni /bin/cdni /usr/bin/cd.
derobert
1
Je suppose que cela ne rend pas ces systèmes strictement POSIX. Comme tout le monde. :)
kojiro

Réponses:

65

Cela sert principalement à s'assurer que le coffre à outils POSIX est disponible à la fois à l'intérieur et à l'extérieur d'un shell (voir la justification de POSIX pour les obliger ).

En effet cd, ce n’est pas très utile, mais notez que cela cdchange de répertoire mais qu’il a d’autres effets secondaires: il renvoie un état de sortie qui permet de déterminer si vous pouvez chdir()ou non accéder à ce répertoire et un message d’erreur utile expliquant pourquoi vous ne pouvez pas. chdir()quand tu ne peux pas.

Exemple:

dirs_i_am_able_to_cd_into=$(find . -type d -exec cd {} \; -print)

Un autre effet secondaire potentiel est le montage automatique d'un répertoire.

Sur quelques systèmes, la plupart des commandes externes pour les commandes intégrées du shell standard sont implémentées sous forme de lien symbolique vers le même script qui:

#! /bin/sh -
"${0##*/}" "$@"

C’est-à-dire démarrer un shell et exécuter le programme intégré.

Certains autres systèmes (comme GNU) utilisent des utilitaires comme véritables commandes exécutables, ce qui peut prêter à confusion lorsque le comportement diffère de la version intégrée du shell.

Stéphane Chazelas
la source
3
+1 pour l'observation sur les effets secondaires et les messages d'erreur. Il n’est pas toujours bien expliqué aux nouveaux utilisateurs que de nombreux idiomes intelligents sous Unix proviennent d’une utilisation judicieuse des effets secondaires. Et les pages de manuel elles-mêmes n’ont jamais été bonnes pour décrire la situation dans son ensemble.
RBerteig
Est venu ici d'une question similaire sur SO, pourriez-vous préciser ce que vous entendez par "montage automatique d'un répertoire"?
trafiquer le
1
@ en peluche, voir en.wikipedia.org/wiki/Automounter
Stéphane Chazelas
1
Pour décompresser un peu la pensée de Stéphane Chazelas: si vous devez vous assurer qu'un répertoire pouvant être configuré automatiquement est réellement monté sans y apporter de modification et sans essayer de lire aucun fichier, vous pouvez utiliser la cdcommande external . Cela pourrait être utile pour surveiller la disponibilité d'un système de fichiers distant montable automatiquement, ou peut-être avant de faire quelque chose de très urgent.
telcoM
11

Le fait une commande cd non builtin est disponible est essentiellement due à la Posix exigence pour tous les builtins réguliers pour être appelable par les commandes de la famille exec env, find, nice, nohup, timeet xargscombinée au fait certaines de ces commandes ne sont pas eux - mêmes mis en œuvre comme builtins.

Cela n'a pas beaucoup de sens, cdcependant, le combiner avec ces commandes est totalement inutile. Voici cependant des exemples plus ou moins tenables:

find . -type d -exec cd {} \;
env HOME=/foo cd
jlliagre
la source
2
Un certain nombre d'éléments intégrés sont en fait exemptés de cette règle . Bizarrement, le cd n'est pas l'un d'entre eux.
Kevin
5
@ Kevin J'ai écrit que c'était une exigence pour toutes les commandes standard , celles exemptées étaient des commandes spéciales : break, :, continue, . , eval, exec, exit, export, readonly, return, set, shift, times, trap, unsetne seraient pas pertinentes en tant que commandes externes alors qu'il cds'agit d'une commande standard qui a quelques cas d'utilisation documentés en tant que commande.
mardi
1

En plus de vérifier si un chemin correspond à un répertoire accessible, l' cdexécutable traitera et utilisera la CDPATHvariable et imprimera le chemin absolu du répertoire résolu s'il a été utilisé avec succès.

$ export CDPATH=/usr
$ echo bin lib | xargs -n 1 cd
/usr/bin
/usr/lib

Ceci n'est utile que très occasionnellement, mais éviterait de réimplémenter la même logique pour la recherche de répertoires correspondants. Un cas d'utilisation concret consiste à trouver le premier répertoire existant d'un nom particulier sous plusieurs parents possibles.

cdprocessus également OLDPWDpour cd -, mais cela est moins concret puisque la variable d'environnement serait déjà disponible.

Michael Homer
la source