BusyBox được thiết kế theo một cách khá mới lạ có thể khá khó hiểu khi bạn bắt đầu lục lọi trong thư mục / bin của mình.
Như MSalters đã chỉ ra, BusyBox chỉ là một tệp thực thi. Nhưng nó phụ thuộc vào một liên kết tượng trưng được tạo ra để thực thi cho mọi "lệnh" trong đó. Khi biết tên symlink đã được bắt đầu, nó biết chạy hàm C cho lệnh đó.
Do đó, sự khởi đầu của thư mục PuppyLinux 5.2.8 Lucid / bin của tôi trông giống như ...
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
Lưu ý rằng hầu hết các lệnh là symlink đến busybox
. Điều này bao gồm ash
vỏ rất tối giản được sử dụng chủ yếu trong các hoạt động khởi động. Cũng lưu ý rằng tác giả phân phối đã chọn bao gồm các lệnh độc lập bunzip2
và bzcat
thay vì sử dụng các phiên bản busybox. Các liên kết tượng trưng bunzip-BB-NOTUSED
và bzcat-BB-NOTUSED
không thực sự cần thiết nhưng giúp ghi lại những gì đang diễn ra chỉ với chi phí của một liên kết tượng trưng.
Cũng lưu ý rằng một danh sách thư mục báo cáo kích thước cho mục tiêu của liên kết tượng trưng ( ls -lL
hoặc ls -l --dereference
) thay vì chính liên kết tượng trưng, sẽ báo cáo kích thước của mỗi lệnh giống như của lệnh busybox
. Do đó, cùng một danh sách với -L
tùy chọn hiển thị ...
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
Mục tiêu của BusyBox là tái sử dụng tối đa mã trong chính nó để giảm thiểu bộ nhớ và dung lượng ổ đĩa cần thiết (tức là "dấu chân") cho một bộ lệnh chung ... mà không yêu cầu phải có vỏ.
Bash và các vỏ khác hoàn thành điều tương tự. Nhưng để làm như vậy, họ thực hiện môi trường dòng lệnh riêng của họ. Mục tiêu này cũng là một trong những lý do cho một số cú pháp rất cổ xưa cho nhiều chức năng shell.
Tôi hiện đang sử dụng "kỹ thuật BusyBox" này cho một thư viện các hàm Bash và dễ dàng hơn để sử dụng các hàm bao cho các bashism khác nhau . Nó đã cho phép tôi dễ dàng "mở rộng" các lệnh với --help
các tùy chọn và tắt các phiên bản GUI khi khả dụng.