BusyBox został zaprojektowany w dość nowatorski sposób, co może być dość mylące, gdy zaczniesz szperać w katalogach / bin.
Jak wskazali MSalters , BusyBox to tylko jeden plik wykonywalny. Ale zależy to od utworzenia dowiązania symbolicznego do tego pliku wykonywalnego dla każdego „polecenia” w nim zawartego. Znając nazwę dowiązania symbolicznego, z którym został uruchomiony, umie uruchomić funkcję C dla tego polecenia.
Tak więc początek mojego katalogu PuppyLinux 5.2.8 Lucid / bin wygląda jak ...
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
Zauważ, że większość poleceń to dowiązania symboliczne busybox. Obejmuje to ashbardzo minimalistyczną powłokę używaną głównie podczas operacji rozruchu. Zauważ też, że autor dystrybucji zdecydował się na dołączenie samodzielnych poleceń bunzip2i bzcatzamiast używać wersji busyboksa. Dowiązania symboliczne bunzip-BB-NOTUSEDi bzcat-BB-NOTUSEDnie są tak naprawdę konieczne, ale pomagają dokumentować, co się dzieje za cenę samego łącza symbolicznego.
Zauważ też, że lista katalogów, która zgłasza rozmiary dla celu dowiązań symbolicznych ( ls -lLlub ls -l --dereference) zamiast samego dowiązania symbolicznego, zgłosi rozmiar każdego polecenia tak samo, jak rozmiar busybox. Zatem ta sama lista z -Lopcją pokazuje ...
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
Celem BusyBox jest maksymalne ponowne wykorzystanie kodu w sobie, aby zminimalizować wymaganą pamięć i miejsce na dysku (tj. „Ślad”) dla wspólnego zestawu poleceń ... bez konieczności używania samej powłoki.
Bash i inne pociski osiągają to samo. Ale w tym celu implementują własne środowisko wiersza poleceń. Ten cel jest również jednym z powodów bardzo archaicznej składni wielu funkcji powłoki.
Obecnie używam tej „techniki BusyBox” do biblioteki funkcji Bash i łatwiejszych w użyciu opakowań dla różnych bashism . Pozwoliło mi to łatwo „rozszerzyć” komendy o --helpopcje i odpalić wersje GUI, jeśli są dostępne.