On Sat, 9 Jun 2018, at 17:19, Adrian Grigore wrote:
> I sometimes enjoy testing my shell scripts. Opinions?

If you're looking into writing effective unit tests for your shell projects, I 
highly recommend to run the script itself as well as the test in a controlled 
environment. Treat the environment as input to your program:

  * Clear all environment variables and (re-) set only those which are needed, 
and
  * When writing the script per se, check that the environment fits your 
requirements and if not, provide appropriate settings.

This is necessary since shell scripts may call out to tools which make certain 
assumptions about the environment and may behave incorrectly if assumptions are 
not met:

  * Locale-related environment variables control a lot of text processing 
aspects in the libc and other libraries and tools like ncurses. If you get 
UTF-8 input and run with noncompatible locale settings, you'll be in for a bad 
time. Some tools may fail to initialize correctly. For example, $HOME is not 
guaranteed to be set in Bash and tools that depend on it may fail while tilde 
home directory expansion uses passwd and will continue to work.

  * The environment changes depending on the execution context: Invoking a 
program from your current shell will produce a wildly different environement 
than running during system start under sysvinit, which again will be different 
from running a program in a separate cgroup with cleansed environment, which 
again will be different when just invoking /etc/init.d/program from your 
current shell.

The environment can make or break your script/program.

Reply via email to