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
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 ).
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
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.
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.
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.
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.
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.
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.
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.
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.