- Split the library into several files
- Automatically load all library files
- How to prevent a library script to be executed
Split the library into several files
The number of functions to be put into a script might grow, there is also a chance that you want to group it into categories, and I also like the idea of separating variables from functions i.e. I would want to have one file global_vars.sh containing all the variables (and exporting them) and one with functions only.Since variables can be exported and are thus available to sub processes a lib containing variable settings need only be sourced in in the very first script, neither sub process needs to do that, they just need to be made aware of it somehow.
One idea to achieve that: set a special variable at the beginning of your library script and check that variable in your calling script
# library script lib_vars_loaded=1; export lib_vars_loaded # calling script #!/bin/sh if [ -z "$lib_vars_loaded" ] ; then # Here comes the code to load the lib fi
Automatically load all library files
A follow-up idea to creating a shell library (and of course derived from what ksh and bash offer) one could think of autoloading all files in a lib directory i.e. the directory consists of (small) files each containing a shell function and all files will be automatically loaded by a script.# This is the path where all library scripts reside setenv FPATH /opt/shell/lib:$HOME/lib #!/bin/sh # Require that FPATH is set [ -n "$FPATH" ] || { echo Error: FPATH is not set ; exit 1 ; } # Replace colon by space in FPATH dirpath=`echo "$FPATH" | tr : ' ' ` # Loop through 'dirpath' to find the library for dir in $dirpath ; do # Loop through all files in 'dir' (this excludes files starting with '.') for file in ${dir}/* ; do # Check if the lib is a readable file in the given dir [ -r "${file}" -a -f "${file}" ] && . "${file}" doneThings to think about:
- files are sourced in in alphabetical order, there should not be a dependency on order, this is particularily interesting if you have variable settings split into multiple files, then one var might depend on one which is set in another file which then has to be loaded first.
- if you don't need all functions in your script why load them? that is probably excessive and you want to load just what you need
- if you need a new function simply put it into a script of its own and add it to the dir, it will be autoloaded, no risk of breaking an existing lib file with syntax error and you know immediately where the error sits
How to prevent a library script to be executed
I found this in a book: put in this line at the top of the library script#!/bin/echo Error:_this_needs_to_sourced_in ...and accidentally executing the script will lead to an echoed line (with exit code 0).
No comments:
Post a Comment