User Tools

Site Tools


unixscripts:3-decentbash

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
decentbash [2015/12/31 02:53] adminunixscripts:3-decentbash [2020/10/17 03:04] (current) admin
Line 1: Line 1:
 +=====Unixscripts:Decent Bash=====
 +
 Here's my five penn'orth. A bash script (actually any program!!) should: 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:+====Use getopt(1)==== 
 +Use **getopt**(1) to process command line 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!!     * 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''     * supports short option merging eg ''foobar -s -f -t == foobar -sft''
Line 9: Line 12:
     * plain old simple works - why write bug-prone new code when **getopt**(1) just works?     * plain old simple works - why write bug-prone new code when **getopt**(1) just works?
  
-  * Even better, use my **getopt**(1) wrapper [[argp.sh]]+====Use argp.sh(1)==== 
-    * a single place to define options which is then used to:+Even better, use my **getopt**(1) wrapper [[unixscripts:2-argp.sh]] which is kinda sorta like GNU'**argp**(3) in glibc. It gives you a single place to define options which is then used to:
       * create the **getopt**(1) command line,        * create the **getopt**(1) command line, 
       * process the options setting appropriate environment parameters        * process the options setting appropriate environment parameters 
       * print help & man pages without any extra code       * print help & man pages without any extra code
       * honours GNU's [[http://www.gnu.org/software/libtool/manual/libc/Argp-User-Customization.html | ARGP_HELP_FMT ]] environment variable       * honours GNU's [[http://www.gnu.org/software/libtool/manual/libc/Argp-User-Customization.html | ARGP_HELP_FMT ]] environment variable
-      * is pretty similar to GNU's **argp**(3) **getopt**(3) wrapper in glibc+      * is pretty similar to GNU's **argp**(3) which is a **getopt**(3) wrapper in glibc
       * further reduces the chance of bugs arising - particularly as the script is maintained       * further reduces the chance of bugs arising - particularly as the script is maintained
       * increase the chance that help and man pages are actually written       * increase the chance that help and man pages are actually written
-  * Always provide long options as well as single letter options - they're more mnemonic for infrequent users and provide valuable documentation when scripted. 
-  * respond to the **-h, --help** option 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 should go 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 
  
 +====Support Long options====
 +Always provide long options as well as single letter options - they're more mnemonic for infrequent users and provide valuable documentation when scripted.
 +
 +====Provide help====
 +respond to the **-h, --help** option with a usage message to **!!!STDOUT!!!** and exit 0. This help should be available no matter what the machine's state - so issue it before looking for dependencies and without making assumptions about what is installed.
 +
 +If there are specific dependencies, then make sure they are documented in the help message.
 +
 +====Provide version info====
 +provide a way to get the program's version eg **-V, --version** to **!!!STDOUT!!!** and exit 0
 +
 +Note that **-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
 +
 +====Be disciplined with error messages====
 +Error messages should go 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.''
 +
 +====Be disciplined with error exit codes====
 +non-zero exit on any error
 +
 +====Silence is golden====
 +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)
 +
 +====man(1) page====
 +include a man page if non-trivial
 +
 +====Use a crunchbang====
 +always include the //crunchbang// as the first line:
 +
 +  #! /usr/bin/env bash
 +
 +====Structure the code====
 +use subroutines heavily - only put the following in the mainline:
 +
 +  initialise
 +  process_options "$@"
 +  main "$@"
unixscripts/3-decentbash.1451555593.txt.gz · Last modified: 2015/12/31 02:53 by admin

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki