unixscripts:3-decentbash
This is an old revision of the document!
Here's my five penn'orth. A bash script (actually any program!!) should:
- use getopt(1) to process arguments. There are many good reasons for this. Just do it. Let me count (some of) the ways:
- provides a rational, predictable user interface - compare the nasty old peculiarities of tar and find!!
- supports short option merging eg
foobar -s -f -t == foobar -sft
- disambiguates option argument spacing eg foobar -z1 == foobar -z 1
- re-orders options so they can be processed and then popped and forgotten
- supports – to terminate options
- plain old simple works - why write bug-prone new code when getopt just works?
- Even better, use my getopt wrapper argp.sh.
- a single place to define options which is then used to:
- create getopt command line,
- process the options as they enter and
- print help & man pages
- help page printing is automatically pretty - lines wrapped, nicely spaced out etc
- honours GNU's ARGP_HELP_FMT environment variable
- is pretty similar to GNU's argp getopt wrapper in glibc
- further reduces the chance of bugs arising - particularly as the script is maintained
- increase the chance that help and man pages are actually written
- provide long options as well as single letter options - they're more mnemonic for infrequent users and provide valuable documentation when scripted.
- respond to -h/–help with a usage message to !!!STDOUT!!! and exit 0
- provide a way to get the program's version eg -V/–version to !!!STDOUT!!! and exit 0
- -h and -V processing should happen before any other substantial processing or checking is done - make sure -h can always be done no matter what
- error messages to !!!STDERR!!! - do not print the usage as it just fills the screen and hides the meat of the error. At the most, refer the user to the usage page with “run 'foobar -h' for help or 'man foobar' for a reference manual.”
- non-zero exit on any error
- execute as silently as possible so the user doesn't have to scour through copious output. If feedback on progress is needed, just “echo -n .”
- The exception, of course, is if a verbosity command is given, generally with -v/–verbose - and the output goes to stdout, thank you very much (so we can distinguish bash's own -x output which goes to stderr)
- include a man page if non-trivial
unixscripts/3-decentbash.1451555085.txt.gz · Last modified: 2015/12/31 02:44 by admin