#
# For a description of the syntax of this configuration file,
# see scripts/kbuild/config-language.txt.
#

menu "Another Bourne-like Shell"

choice
	prompt "Choose your default shell"
	default CONFIG_FEATURE_SH_IS_NONE
	help
	  Choose a shell. The ash shell is the most bash compatible
	  and full featured one.

config CONFIG_FEATURE_SH_IS_ASH
	select CONFIG_ASH
	bool "ash"

config CONFIG_FEATURE_SH_IS_HUSH
	select CONFIG_HUSH
	bool "hush"

config CONFIG_FEATURE_SH_IS_LASH
	select CONFIG_LASH
	bool "lash"

config CONFIG_FEATURE_SH_IS_MSH
	select CONFIG_MSH
	bool "msh"

config CONFIG_FEATURE_SH_IS_NONE
	bool "none"

endchoice

config CONFIG_ASH
	bool "ash"
	default y
	help
	  Tha 'ash' shell adds about 60k in the default configuration and is
	  the most complete and most pedantically correct shell included with
	  busybox.  This shell is actually a derivative of the Debian 'dash'
	  shell (by Herbert Xu), which was created by porting the 'ash' shell
	  (written by Kenneth Almquist) from NetBSD.  

comment "Ash Shell Options"
	depends on CONFIG_ASH

config CONFIG_ASH_JOB_CONTROL
	bool "  Enable Job control"
	default y
	depends on CONFIG_ASH
	help
	  Enable job control in the ash shell.

config CONFIG_ASH_ALIAS
	bool "  Enable alias support"
	default y
	depends on CONFIG_ASH
	help
	  Enable alias support in the ash shell.

config CONFIG_ASH_MATH_SUPPORT
	bool "  Enable Posix math support"
	default y
	depends on CONFIG_ASH
	help
	  Enable math support in the ash shell.

config CONFIG_ASH_GETOPTS
	bool "  Enable getopt builtin to parse positional parameters"
	default n
	depends on CONFIG_ASH
	help
	  Enable builtin getopt in the ash shell.

config CONFIG_ASH_CMDCMD
	bool "  Enable cmdcmd to override shell builtins"
	default n
	depends on CONFIG_ASH
	help
	  Enable support for the ash 'command' builtin, which allows
	  you to run the specified command with the specified arguments,
	  even when there is an ash builtin command with the same name.

config CONFIG_ASH_MAIL
	bool "  Check for new mail on interactive shells"
	default y
	depends on CONFIG_ASH
	help
	  Enable "check for new mail" in the ash shell.

config CONFIG_ASH_OPTIMIZE_FOR_SIZE
	bool "  Optimize for size instead of speed"
	default y
	depends on CONFIG_ASH
	help
	  Compile ash for reduced size at price of speed.

config CONFIG_HUSH
	bool "hush"
	default n
	help
	  hush is a very small shell (just 18k) and it has fairly complete
	  Bourne shell grammar.  It even handles all the normal flow control
	  options such as if/then/elif/else/fi, for/in/do/done, while loops,
	  etc.

	  It does not handle case/esac, select, function, here documents ( <<
	  word ), arithmetic expansion, aliases, brace expansion, tilde
	  expansion, &> and >& redirection of stdout+stderr, etc.


config CONFIG_LASH
	bool "lash"
	default n
	help
	  lash is the very smallest shell (adds just 10k) and it is quite
	  usable as a command prompt, but it is not suitable for any but the
	  most trivial scripting (such as an initrd that calls insmod a few
	  times) since it does not understand any Bourne shell grammar.  It
	  does handle pipes, redirects, and job control though.  Adding in
	  command editing makes it a very nice lightweight command prompt.


config CONFIG_MSH
	bool "msh"
	default n
	help
	  The minix shell (adds just 30k) is quite complete and handles things
	  like for/do/done, case/esac and all the things you expect a Bourne
	  shell to do.  It is not always pedantically correct about Bourne
	  shell grammar (try running the shell testscript "tests/sh.testcases"
	  on it and compare vs bash) but for most things it works quite well.
	  It also uses only vfork, so it can be used on uClinux systems.

comment "Bourne Shell Options"
	depends on CONFIG_MSH || CONFIG_LASH || CONFIG_HUSH || CONFIG_ASH

config CONFIG_FEATURE_COMMAND_EDITING
	bool "command line editing"
	default n
	depends on CONFIG_MSH || CONFIG_LASH || CONFIG_HUSH || CONFIG_ASH
	help
	  Enable command editing in shell.

config CONFIG_FEATURE_COMMAND_SAVEHISTORY
	bool "  history saving"
	default n
	depends on CONFIG_ASH
	help
	  Enable history saving in ash shell.

config CONFIG_FEATURE_COMMAND_TAB_COMPLETION
	bool "tab completion"
	default n
	depends on CONFIG_MSH || CONFIG_LASH || CONFIG_HUSH || CONFIG_ASH
	help
	  Enable tab completion in shell.

config CONFIG_FEATURE_COMMAND_USERNAME_COMPLETION
	bool "username completion"
	default n
	depends on CONFIG_MSH || CONFIG_LASH || CONFIG_HUSH || CONFIG_ASH
	help
	  Enable username completion in shell.

config CONFIG_FEATURE_COMMAND_HISTORY
	int "history size"
	default 15
	depends on CONFIG_MSH || CONFIG_LASH || CONFIG_HUSH || CONFIG_ASH
	help
	  Specify command history size in shell.

config CONFIG_FEATURE_SH_STANDALONE_SHELL
	bool "Standalone shell"
	default n
	depends on CONFIG_MSH || CONFIG_LASH || CONFIG_HUSH || CONFIG_ASH
	help
	  Have all the busybox commands built into the shell, creating
	  a standalone shell.

config CONFIG_FEATURE_SH_APPLETS_ALWAYS_WIN
	bool "Standalone shell -- applets always win"
	default n
	depends on CONFIG_FEATURE_SH_STANDALONE_SHELL
	help
	  Use a command builtin to the shell over one with the same name,
	  that may be on the system.

config CONFIG_FEATURE_SH_FANCY_PROMPT
	bool "Fancy shell prompts"
	default n
	depends on CONFIG_MSH || CONFIG_LASH || CONFIG_HUSH || CONFIG_ASH
	help
	  Setting this option allows for prompts to use things like \w and
	  \$ and also using escape codes.

config CONFIG_FEATURE_SH_EXTRA_QUIET
	bool "Hide message on interactive shell startup"
	default n
	depends on CONFIG_MSH || CONFIG_LASH || CONFIG_HUSH || CONFIG_ASH
	help
	  Remove the busybox introduction when starting a shell.

endmenu

