NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: standards/42828: Almquist shell always evaluates the contents of ${ENV} even if non-interactive



The following reply was made to PR standards/42828; it has been noted by GNATS.

From: Robert Elz <kre%munnari.OZ.AU@localhost>
To: gnats-bugs%NetBSD.org@localhost
Cc: 
Subject: Re: standards/42828: Almquist shell always evaluates the contents of 
${ENV} even if non-interactive
Date: Thu, 18 Feb 2010 05:36:43 +0700

 Note that this change makes sh fail to live up to its documentation ...
 
      If the environment variable ENV is set on entry to a shell, or is set in
      the .profile of a login shell, the shell next reads commands from the
      file named in ENV.  Therefore, a user should place commands that are to
      be executed only at login time in the .profile file, and commands that
      are executed for every shell inside the ENV file.  To set the ENV vari-
      able to some file, place the following line in your .profile of your home
      directory
 
            ENV=$HOME/.shinit; export ENV
 
      substituting for ``.shinit'' any filename you wish.  Since the ENV file
      is read for every invocation of the shell, including shell scripts and
      non-interactive shells, the following paradigm is useful for restricting
      commands in the ENV file to interactive invocations.  Place commands
      within the ``case'' and ``esac'' below (these commands are described
      later):
 
            case $- in *i*)
                  # commands for interactive use only
                  ...
            esac
 
 
 In particular, with this being a significant change, it is definitely
 not suitable for a pullup to NetBSD 5 (or any existing released system).
 
 Further, this is a case where sanity ought to win over standards, there's
 lots of stuff where our shell isn't the same as wha POSIX says it should
 be, some of considerably more importance than this one.
 
 It is trivial (as the doc says) to make the script be a no-op in
 non-interactive shells, if that's what's needed.   On the other hand,
 if ${ENV} isn't run when *every* shell starts, what is?   If there's
 nothing, ten all that's left is what's in the environment to tailor
 the shell, and not everything can be done there, and even when it can,
 passing around all kinds of shell specific noise in the environment, to
 every process that runs, isn't a sane way of operating.
 
 What's more, "ENV" is the name of the env var that sets the startup
 script for everthing that's a basically Bourne compatible shell (though
 that shell had no similar concept, of course) - but not all shells are
 the same, and stuff that fits one shell won't fit.  The effect of this
 is that it isn't sane to put just any random script as $ENV, the script
 needs to be aware of why it will be invoked, and in what possible
 environments, and do sane things (for which, running other shell scripts,
 without resetting ENV first, is not included).
 
 I'd put this pack the way it was.   Screw POSIX in this case.
 
 kre
 


Home | Main Index | Thread Index | Old Index