BusyBox est conçu d'une manière assez originale qui peut être assez déroutante lorsque vous commencez à fouiller dans vos répertoires / bin.
Comme MSalters l'a indiqué, BusyBox n'est qu'un exécutable. Mais cela dépend de la création d'un lien symbolique vers cet exécutable pour chaque "commande" qu'il contient. En connaissant le nom du lien symbolique avec lequel il a été démarré, il sait exécuter la fonction C pour cette commande.
Ainsi, le début de mon répertoire PuppyLinux 5.2.8 Lucid / bin ressemble à ...
sh-4.1# ls -l
total 4889
lrwxrwxrwx 1 root root 7 2011-08-17 10:49 [ -> busybox
lrwxrwxrwx 1 root root 7 2011-08-17 10:49 [[ -> busybox
lrwxrwxrwx 1 root root 7 2011-08-17 10:49 addgroup -> busybox
lrwxrwxrwx 1 root root 7 2011-08-17 10:49 adduser -> busybox
lrwxrwxrwx 1 root root 7 2011-08-17 10:49 ash -> busybox
-rwxr-xr-x 1 root root 2844 2011-08-17 11:04 autologinroot
lrwxrwxrwx 1 root root 4 2011-08-17 10:49 awk -> gawk
lrwxrwxrwx 1 root root 7 2011-08-17 10:49 basename -> busybox
-rwxr-xr-x 1 root root 805960 2011-08-17 11:04 bash
-r-xr-xr-x 1 root root 6835 2011-01-21 01:29 bashbug
lrwxrwxrwx 1 root root 7 2011-08-17 10:49 bbconfig -> busybox
-rwxr-xr-x 1 root root 30200 2011-08-17 11:04 bunzip2
lrwxrwxrwx 1 root root 7 2011-08-17 10:49 bunzip2-BB-NOTUSED -> busybox
-rwxr-xr-x 1 root root 637960 2011-08-17 11:04 busybox
-rwxr-xr-x 1 root root 30200 2011-08-17 11:04 bzcat
lrwxrwxrwx 1 root root 7 2011-08-17 10:49 bzcat-BB-NOTUSED -> busybox
Notez que la plupart des commandes sont des liens symboliques vers busybox
. Cela inclut le ash
shell très minimaliste utilisé principalement pendant les opérations de démarrage. Notez également que l'auteur de la distribution a choisi d'inclure les commandes autonomes bunzip2
et bzcat
au lieu d'utiliser les versions de busybox. Les liens symboliques bunzip-BB-NOTUSED
et bzcat-BB-NOTUSED
ne sont pas vraiment nécessaires, mais aident à documenter ce qui se passe pour le coût d'un lien symbolique.
Notez également qu'un répertoire répertoriant les tailles de la cible des liens symboliques ( ls -lL
ou ls -l --dereference
) au lieu du lien symbolique lui-même, indiquera la taille de chaque commande comme étant identique à celle de busybox
. Ainsi, la même liste avec l' -L
option montre ...
sh-4.1# ls -lL
total 60402
-rwxr-xr-x 1 root root 637960 2011-08-17 11:04 [
-rwxr-xr-x 1 root root 637960 2011-08-17 11:04 [[
-rwxr-xr-x 1 root root 637960 2011-08-17 11:04 addgroup
-rwxr-xr-x 1 root root 637960 2011-08-17 11:04 adduser
-rwxr-xr-x 1 root root 637960 2011-08-17 11:04 ash
-rwxr-xr-x 1 root root 2844 2011-08-17 11:04 autologinroot
-rwxr-xr-x 1 root root 317880 2011-08-17 11:04 awk
-rwxr-xr-x 1 root root 637960 2011-08-17 11:04 basename
-rwxr-xr-x 1 root root 805960 2011-08-17 11:04 bash
-r-xr-xr-x 1 root root 6835 2011-01-21 01:29 bashbug
-rwxr-xr-x 1 root root 637960 2011-08-17 11:04 bbconfig
-rwxr-xr-x 1 root root 30200 2011-08-17 11:04 bunzip2
-rwxr-xr-x 1 root root 637960 2011-08-17 11:04 bunzip2-BB-NOTUSED
-rwxr-xr-x 1 root root 637960 2011-08-17 11:04 busybox
-rwxr-xr-x 1 root root 30200 2011-08-17 11:04 bzcat
-rwxr-xr-x 1 root root 637960 2011-08-17 11:04 bzcat-BB-NOTUSED
L'objectif de BusyBox est la réutilisation maximale du code en lui-même afin de minimiser la mémoire et l'espace disque requis (c'est-à-dire "l'empreinte") pour un ensemble commun de commandes ... sans nécessiter un shell lui-même.
Bash et autres obus accomplissent la même chose. Mais pour ce faire, ils implémentent leur propre environnement de ligne de commande. Cet objectif est également l'une des raisons de la syntaxe très archaïque de nombreuses fonctionnalités du shell.
J'utilise actuellement cette "technique BusyBox" pour une bibliothèque de fonctions Bash et des wrappers plus faciles à utiliser pour divers bashismes . Il m'a permis "d'étendre" facilement les commandes avec des --help
options et de lancer des versions GUI lorsqu'elles sont disponibles.