[gnu.bash.bug] bash exports in declare

bfox@AUREL.CALTECH.EDU (Brian Fox) (07/20/89)

   Date: Wed, 19 Jul 89 09:03:56 EDT
   From: barratt@dash.mitre.org (Jeff Barratt)

   Brian,

	   Nice job on bash.

	   We're running v1.02 on Sun 3's w OS4.01.

   Problem: "declare -x" and "typeset -x" do NOT seem to export.  A
   separate "export vars" is required.

Thanks.  This turned out to be a simple problem and fix.  In
builtins.c, function declare_internal (), the lines which read

	  else if (*t == 'x')
	    *flags |= att_exported, t++;

needs to have "array_needs_making = 1" added to it.

	  else if (*t == 'x')
	    *flags |= att_exported, t++, array_needs_making = 1;

This tells bash that the list of exported variables has changed, and
needs to be recalculated.

   Question:  Could you elaborate on the startup execution of default
   files.  It appears that initial login runs "~/.bash_profile", and
   subsequent shells run "~/.bashrc".  What about
   "~/.bash_(login,logout)"?

Sure, and since you aren't the first to ask about this, I'll take a
little time to make sure I document it clearly.  The follwing is the way
that Bash 1.03 (pre-release) does it.  Earlier releases have the
exception of not having the "ENV" variable, and of executing ~/.bashrc
for shell scripts.

    When and how bash executes login, rc, and logout files.

    Login shells:
      On login:
	    if /etc/profile exists, source it.

	    if ~/.bash_profile exists, source it,
	      else if ~/.bash_login exists, source it,
		else if ~/.profile exists, source it.
      On logout:
	    if ~/.bash_logout exists, source it.

    Non-login interactive shells:
      On startup:
	    if ~/.bashrc exists, source it.

    Non-interactive shells:
      On startup:
	    if the environment variable "ENV" in non-null, source the file
	    mentioned there.

    So, typically, your ~/.bash_profile file contains the line

	    if [ -f ~/.bashrc ]; then source ~/.bashrc; fi

    after (or before) any login specific initializations.

    You can tell if a shell is interactive or not from within your ~/.bashrc
    file by examining $PS1; it is unset in non-interactive shell, and set in
    interactive shells.  Thus:

	    if [ "$PS1" = "" ]; then
	       echo This shell is not interactive
	    else
	       echo This shell is interactive
	    fi

Thanks,

	Brian Fox