web-dev-qa-db-fra.com

où se trouve `cd`?

Dans un sous-shell bash, j'obtiens l'erreur suivante lors de l'exécution de cd

Sudo: cd: command not found

Cela est attendu car je n'ai pas de chemin. Habituellement, pour contourner ce problème, je fournis simplement le chemin complet comme suit: (/ usr/local/bin/foo)

À ma grande surprise, cd ne semble se trouver dans aucun des endroits normaux.

which cd
whereis cd
ls /bin | grep cd

Par comparaison, ls est exactement là où je m'attendais.

which ls
/bin/ls

Où se trouve la commande cd? Et pourquoi est différent de toutes les autres commandes?

Mise à jour

Un autre tidbit intéressant, cd n'apparaît pas dans hash

hash
0   /bin/ls
2   /usr/bin/find
2   /sbin/ip
1   /usr/bin/updatedb
1   /usr/bin/apt-get
36
spuder

Quel CD est-ce que j'utilise?

Si vous êtes dans Bash cd est une fonction intégrée. La commande type le confirme même:

$ type -a cd
cd is a Shell builtin
cd is /usr/bin/cd
cd is /bin/cd

Le système utilisera la première chose de cette liste, donc le builtin sera l'option préférée, et la seule qui fonctionne (voir la section ci-dessous sur Qu'est-ce que/bin/cd ).

Qu'est-ce qu'un builtin?

J'aime penser aux builtins comme des fonctions que Bash sait faire lui-même. Fondamentalement, tout ce que vous utilisez beaucoup a été déplacé dans le "noyau" Bash afin qu'il n'ait pas à exécuter un processus à chaque fois.

Vous pouvez toujours dire explicitement à Bash que vous voulez une fonction intégrée en utilisant la commande builtin comme ceci:

$ builtin cd

Consultez l'aide sur builtin:

$ help builtin

Pourquoi le cd n'est-il pas haché?

Le hachage est uniquement destiné à "hacher" (aka. "Enregistrer" dans une paire clé/valeur) les emplacements des fichiers, pas pour les commandes internes ou les mots clés. La tâche principale de hash est d'économiser en passant par le $PATH à chaque recherche d'exécutables fréquemment utilisés.

Mots clés?

Ce sont généralement les commandes qui font partie des fonctionnalités du langage de programmation de Bash.

$ type while
while is a Shell keyword
$ type for
for is a Shell keyword
$ type !
! is a Shell keyword

Certaines choses sont implémentées de plusieurs manières, telles que [:

$ type -a [
[ is a Shell builtin
[ is /usr/bin/[
[ is /bin/[    

... et cd comme vous l'avez découvert.

Qu'est-ce que/bin/cd?

Sur mon système Fedora 19 /bin/cd est en fait un script Shell:

$ more /bin/cd
#!/bin/sh
builtin cd "$@"

Mais cela ne fait pas ce que vous pensez. Voir ces autres questions et réponses U&L pour plus de détails:

Conclusion:

POSIX nécessite qu'il soit là et dans cette implémentation, il agit comme un test, confirmant que vous pouvez changer les répertoires en X, mais renvoyant ensuite un code retour confirmant ou niant que cela est possible.

47
slm

C'est une fonction intégrée. Voir man bash pour les détails de cd et le manuel Bash pour une description des commandes intégrées:

Les commandes intégrées sont contenues dans le shell lui-même. Lorsque le nom d'une commande intégrée est utilisé comme premier mot d'une commande simple (voir Commandes simples), le shell exécute la commande directement, sans appeler un autre programme. Les commandes intégrées sont nécessaires pour implémenter des fonctionnalités impossibles ou peu pratiques à obtenir avec des utilitaires distincts.
16
jasonwryan

type et whereis peuvent vous montrer que, par exemple.

Pour grep:

$ type grep
grep is /bin/grep

Pour chown:

$ whereis chown
chown: /bin/chown /usr/share/man/man2/chown.2.gz /usr/share/man/man1/chown.1.gz

locate peut également être utile pour afficher des fichiers associés basés sur une recherche générique, par exemple pour la commande chown:

$ locate chown
/bin/chown
/home/durrantm/.rvm/gems/Ruby-1.9.3-p194/doc/rubyzip-0.9.8/ri/Zip/ZipFileSystem/ZipFsFile/chown-i.ri
/usr/lib/pt_chown
/usr/share/man/man2/fchown32.2.gz
/usr/share/man/man2/fchownat.2.gz
/usr/share/man/man2/lchown.2.gz
/usr/share/man/man2/lchown32.2.gz
/usr/share/zsh/functions/Completion/Unix/_chown

Enfin, lorsque le résultat est que la commande est "intégrée", comme vous l'avez vu pour cd, cela signifie que le code correspondant est en fait dans le programme principal bash et non dans un programme différent situé ailleurs sur le disque.

3
Michael Durrant

Tout comme les commandes internes et externes de DOS. Des commandes simples sont implémentées dans le shell (le plus souvent command.com). Des commandes plus complexes et moins utilisées sont implémentées dans des fichiers exécutables séparés pour réduire la complexité de l'interpréteur de commandes et la consommation de mémoire, qui sont alors des commandes externes.

1
phuclv

cd est une fonction intégrée pour les shells, par exemple. bash, csh, ksh.

Il existe de nombreuses fonctions intégrées prenant en charge les shells, vous pouvez les vérifier en utilisant le man bash commande.

1
OmPS

cd est une fonction intégrée de Shell, comme d'autres l'ont déjà mentionné:

$ type cd
cd is a Shell builtin

En effet, un processus ne peut pas modifier le répertoire de travail d'un autre processus sans utiliser ptrace() (que gdb utilise, par exemple). Ce serait une surcharge inutile. De plus, son utilisation est limitée par certaines distributions comme Ubuntu.

0
nyuszika7h