O BusyBox foi projetado de uma maneira bastante nova que pode ser bastante confusa quando você começa a vasculhar os diretórios / bin.
Como MSalters indicou, o BusyBox é apenas um executável. Mas isso depende da criação de um link simbólico com o executável para cada "comando" nele. Ao saber o nome do link simbólico com o qual foi iniciado, ele sabe executar a função C para esse comando.
Assim, o início do meu diretório PuppyLinux 5.2.8 Lucid / bin se parece com ...
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
Observe que a maioria dos comandos são links simbólicos para busybox
. Isso inclui o ash
shell muito minimalista usado principalmente durante as operações de inicialização. Observe também que o autor da distribuição optou por incluir os comandos independentes bunzip2
e, em bzcat
vez de usar as versões do busybox. Os links simbólicos bunzip-BB-NOTUSED
e bzcat-BB-NOTUSED
não são realmente necessários, mas ajudam a documentar o que está acontecendo apenas pelo custo de um link simbólico.
Observe também que um diretório que relate os tamanhos para o destino dos links simbólicos ( ls -lL
ou ls -l --dereference
) em vez do próprio link simbólico, relatará o tamanho de cada comando como o mesmo de busybox
. Assim, a mesma lista com a -L
opção mostra ...
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
O objetivo do BusyBox é a reutilização máxima de código dentro de si, a fim de minimizar a memória e o espaço em disco necessários (ou seja, a "área ocupada") para um conjunto comum de comandos ... sem exigir o próprio shell.
Bash e outras conchas realizam a mesma coisa. Mas, para isso, eles implementam seu próprio ambiente de linha de comando. Esse objetivo também é um dos motivos de algumas das sintaxes muito arcaicas de muitas funcionalidades do shell.
Atualmente, estou usando essa "técnica BusyBox" para uma biblioteca de funções do Bash e mais fácil de usar wrappers para vários bashismos . Ele me permitiu "estender" facilmente comandos com --help
opções e disparar versões da GUI, quando disponíveis.