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, когда они доступны.