La réponse est plus ou moins ls
un exécutable externe. Vous pouvez voir son emplacement en exécutant type -p ls
.
Pourquoi n'est-il pas ls
intégré au shell, alors? Eh bien, pourquoi devrait-il en être ainsi? Le travail d'un shell n'est pas d'englober toutes les commandes disponibles, mais de fournir un environnement capable de les exécuter. Certains shells modernes ont echo
, printf
et leurs semblables en tant que builtins, qui ne doivent pas être techniquement intégrés, mais qui le sont pour des raisons de performances lorsqu'ils sont exécutés de manière répétée (principalement en boucles serrées). Sans les rendre intégrés, le shell devrait bifurquer et exécuter un nouveau processus pour chaque appel, ce qui pourrait être extrêmement lent.
À tout le moins, l'exécution ls
, un exécutable externe, nécessite l'exécution d'une des exécutions système de la famille exec. Vous pouvez le faire sans bifurquer, mais cela remplacerait le shell principal que vous utilisez. Vous pouvez voir ce qui se passe dans cette instance en procédant comme suit:
exec ls; echo "this never gets printed"
Puisque l'image de processus de votre shell est remplacée, le shell actuel n'est plus accessible après cela. Pour que le shell puisse continuer à s'exécuter après avoir exécuté ls, la commande doit être intégrée au shell.
Le fork permet de remplacer un processus qui n'est pas votre shell principal, ce qui signifie que vous pouvez continuer à exécuter votre shell par la suite.
ls
un programme externeecho *
ouecho * .*
(selon les options du shell), il répertorie les fichiers sans bifurquer.