# vi: set sw=4 ts=4:

=head1 NAME

BusyBox - The Swiss Army Knife of Embedded Linux

=head1 SYNTAX

 BusyBox <function> [arguments...]  # or

 <function> [arguments...]	    # if symlinked

=head1 DESCRIPTION

BusyBox combines tiny versions of many common UNIX utilities into a single
small executable. It provides minimalist replacements for most of the utilities
you usually find in GNU coreutils, util-linux, etc. The utilities in BusyBox
generally have fewer options than their full-featured GNU cousins; however, the
options that are included provide the expected functionality and behave very
much like their GNU counterparts.

BusyBox has been written with size-optimization and limited resources in mind.
It is also extremely modular so you can easily include or exclude commands (or
features) at compile time. This makes it easy to customize your embedded
systems. To create a working system, just add /dev, /etc, and a Linux kernel.
BusyBox provides a fairly complete POSIX environment for any small or embedded
system.

BusyBox is extremely configurable.  This allows you to include only the
components you need, thereby reducing binary size. Run 'make config' or 'make
menuconfig' to select the functionality that you wish to enable.  Then run
'make' to compile BusyBox using your configuration.

After the compile has finished, you should use 'make install' to install
BusyBox. This will install the 'bin/busybox' binary, in the target directory
specified by PREFIX. PREFIX can be set when configuring BusyBox, or you can
specify an alternative location at install time (i.e., with a command line
like 'make PREFIX=/tmp/foo install'). If you enabled any applet installation
scheme (either as symlinks or hardlinks), these will also be installed in
the location pointed to by PREFIX.

=head1 USAGE

BusyBox is a multi-call binary.  A multi-call binary is an executable program
that performs the same job as more than one utility program.  That means there
is just a single BusyBox binary, but that single binary acts like a large
number of utilities.  This allows BusyBox to be smaller since all the built-in
utility programs (we call them applets) can share code for many common operations.

You can also invoke BusyBox by issuing a command as an argument on the
command line.  For example, entering

	/bin/busybox ls

will also cause BusyBox to behave as 'ls'.

Of course, adding '/bin/busybox' into every command would be painful.  So most
people will invoke BusyBox using links to the BusyBox binary.

For example, entering

	ln -s /bin/busybox ls
	./ls

will cause BusyBox to behave as 'ls' (if the 'ls' command has been compiled
into BusyBox).  Generally speaking, you should never need to make all these
links yourself, as the BusyBox build system will do this for you when you run
the 'make install' command.

If you invoke BusyBox with no arguments, it will provide you with a list of the
applets that have been compiled into your BusyBox binary.

=head1 COMMON OPTIONS

Most BusyBox commands support the B<--help> argument to provide a terse runtime
description of their behavior.  If the CONFIG_FEATURE_VERBOSE_USAGE option has
been enabled, more detailed usage information will also be available.

=head1 COMMANDS

Currently defined functions include:

