BusyBox разработан довольно новым способом, который может сбивать с толку, когда вы начинаете копаться в каталогах / bin.
Как указал MSalters , BusyBox - это всего лишь один исполняемый файл. Но это зависит от символической ссылки, создаваемой на этот исполняемый файл для каждой «команды» в нем. Зная имя символической ссылки, с которой он был запущен, он знает, как запустить функцию C для этой команды.
Таким образом, начало моего каталога PuppyLinux 5.2.8 Lucid / bin выглядит так ...
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
Обратите внимание, что большинство команд являются символическими ссылками на busybox
. Это включает ash
очень минималистичную оболочку, используемую в основном во время операций загрузки. Также обратите внимание, что автор дистрибутива решил включить автономные команды, bunzip2
а bzcat
не использовать версии busybox. Символические ссылки bunzip-BB-NOTUSED
и bzcat-BB-NOTUSED
не являются действительно необходимыми, но помогают документировать то, что происходит только за стоимость символической ссылки.
Также обратите внимание, что список каталогов, в котором сообщается о размерах для целевой символической ссылки ( ls -lL
или ls -l --dereference
) вместо самой символической ссылки, будет сообщать размер каждой команды такой же, как у busybox
. Таким образом, тот же список с -L
опцией показывает ...
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
Цель BusyBox - максимальное повторное использование кода внутри самого себя, чтобы минимизировать объем памяти и место на диске (то есть «размер») для общего набора команд ... без необходимости самой оболочки.
Баш и другие оболочки делают то же самое. Но для этого они реализуют собственную среду командной строки. Эта цель также является одной из причин очень архаичного синтаксиса для многих функций оболочки.
В настоящее время я использую эту «технику BusyBox» для библиотеки функций Bash и более простую в использовании оболочку для различных bashisms . Это позволило мне легко «расширять» команды --help
опциями и запускать версии GUI, когда они доступны.