zsh-users
 help / color / mirror / code / Atom feed
* init files
@ 1998-08-09 19:08 Sweth Chandramouli
  1998-08-09 22:04 ` Bart Schaefer
  0 siblings, 1 reply; 6+ messages in thread
From: Sweth Chandramouli @ 1998-08-09 19:08 UTC (permalink / raw)
  To: ZSH Users

[-- Attachment #1: Type: text/plain, Size: 1376 bytes --]

	okay, i've been playing around with the init files that
zsh uses, trying to figure out which ones get invoked when, and i 
think i've got it all mostly worked out; the flowchart i've made 
is attached to this message.  i still have some questions, though.
there was a thread about this maybe a year ago, wherein bart (i 
think) had said that the NO_RCS option was checked before the
sourcing of /etc/zshrc and $ZDOTDIR/.zshrc; no matter what i've
tried, however, i've been unable to to reproduce this (which my
chart reflects).  also, i'm not perfectly clear on what tests
are done to determine whether or not a shell is a login shell
and/or an interactive one.  i've got those tests that i've been
able to confirm empirically listed in the footnotes on my chart,
but i'm sure that there are others.  at the very least, the man
pages state that INTERACTIVE can be set to a different value,
whereas whenever i try to do so, i get an error back; similarly,
the tests given in the STARTUP FILES section of the manpage
for a login shell (-l or -zsh) aren't true for any of my login
shells, but they are still recognized as such.  so which are
the tests that i'm missing?

	-- sweth.

-- 
Sweth Chandramouli
IS Coordinator, The George Washington University
<sweth@gwu.edu> / (202) 994 - 8521 (V) / (202) 994 - 0458 (F)
<a href="http://astaroth.nit.gwu.edu/~sweth/disc.html">*</a>

[-- Attachment #2: zshinits --]
[-- Type: text/plain, Size: 3890 bytes --]


ZSH initialization file load sequence:

                        |
                  {/etc/zshenv}
                        |
                        |
                        | (is NO_RCS set?[1])
                        |
                        |
           [yes]        |     [no]
      ----------------------------------
      |                                |
      |                                |
      |                        {$ZDOTDIR/.zshenv}
      |                                |
      |                                | (is this a login shell?[2])
      |                                |
      |                         [yes]  |  [no]
      |                 -------------------------------
      |                 |                             |
      |          {/etc/zprofile}                      |
      |                 |                             | (is this shell
      |        {$ZDOTDIR/.zprofile}                   | interactive?[3])
      |                 |                             |
      |                 |                      [yes]  |  [no]
      |                 |                    -------------------
      |                 |                    |                 |
      |           {/etc/zshrc}         {/etc/zshrc}            |
      |                 |                    |                 | 
      |         {$ZDOTDIR/.zshrc}    {$ZDOTDIR/.zshrc}         |
      |                 |                    |                 |
      |                 |                    |                 |
      |           {/etc/zlogin}              |                 |         
      |                 |                    |                 |        
      |         {$ZDOTDIR/.zlogin}           |                 |
      |                 |                    |                 |
      |                 |                    |                 |
   **************************************************************** 
   *                             SHELL                            *
   **************************************************************** 
      |                 |                    |                 |
      |                 | (is NO_RCS         |                 |
      |                 | set?[1])           |                 |
      |                 |                    |                 |
      |          [yes]  |  [no]              |                 |
      |        -------------------           |                 |  
      |        |                 |           |                 |
      |        |         {$ZDOTDIR/.zlogout} |                 |
      |        |                 |           |                 |
      |        |           {/etc/zlogout}    |                 |
      |        |                 |           |                 |
      x        x                 x           x                 x

Tests are matched as follows, in increasing order of precedence;
`unsetopt OPTION' is equivalent to `setopt NO_OPTION' and `unsetopt
NO_OPTION' is equivalent to `setopt OPTION' in terms of precedence. 
For example, zsh -f with `unsetopt NO_RCS' in /etc/zshenv will source
/etc/zshenv, $ZDOTDIR/.zshenv, /etc/zshrc, and $ZDOTDIR/.zshrc.

[1]   DEFAULT                                   => [no]
      `setopt NO_RCS' called before test        => [yes]
      `-f' flag present on shell invocation     => [yes]
      `setopt RCS' called before test           => [no]
      
[2]   DEFAULT                                   => [no]
      first character of argument zero (name 
         by which zsh is invoked) is `-'        => [yes]
      `-l' flag present on shell invocation     => [yes]
      
[3]   DEFAULT                                   => [no] 
      `-i' flag present on shell invocation     => [yes]
      standard input is a tty and commands 
         are being read from standard input     => [yes]
         

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: init files
  1998-08-09 19:08 init files Sweth Chandramouli
@ 1998-08-09 22:04 ` Bart Schaefer
  1998-08-10  1:02   ` Sweth Chandramouli
  0 siblings, 1 reply; 6+ messages in thread
From: Bart Schaefer @ 1998-08-09 22:04 UTC (permalink / raw)
  To: Sweth Chandramouli, ZSH Users

On Aug 9,  3:08pm, Sweth Chandramouli wrote:
} Subject: init files
}
} there was a thread about this maybe a year ago, wherein bart (i 
} think) had said that the NO_RCS option was checked before the
} sourcing of /etc/zshrc and $ZDOTDIR/.zshrc

Yes, I did say that, but Greg Badros <gjb@cs.washington.edu> pointed
out that I should have said that INTERACTIVE was tested, not NO_RCS.
He included a pointer to a flow chart:

http://www.cs.washington.edu/homes/gjb/ToolsTalks/unix-shell/img009.GIF

} also, i'm not perfectly clear on what tests
} are done to determine whether or not a shell is a login shell

The only test done is whether the LOGIN option is set.  This option may
be set (or unset) explicitly with setopt (unsetopt) or -l (+l), and is
otherwise set only if the first character of argv[0] is '-'.

} and/or an interactive one.

INTERACTIVE is set when isatty(0) is true, and is unset again if the -c
option or the name of a script file is provided, unless -i is also given.
Of course, it's also unset by the +i option.

} at the very least, the man
} pages state that INTERACTIVE can be set to a different value,
} whereas whenever i try to do so, i get an error back

Where do you find that in the man page?  My "man zshoptions" under
INTERACTIVE says, "The value of this option cannot be changed anywhere
other than the command line."

} the tests given in the STARTUP FILES section of the manpage
} for a login shell (-l or -zsh) aren't true for any of my login
} shells

How are you determining this?  What does "echo $0" at a PS1 prompt show?

-- 
Bart Schaefer                                 Brass Lantern Enterprises
http://www.well.com/user/barts              http://www.brasslantern.com


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Re: init files
  1998-08-09 22:04 ` Bart Schaefer
@ 1998-08-10  1:02   ` Sweth Chandramouli
  1998-08-10  3:51     ` Bart Schaefer
  1998-08-10  9:13     ` Zefram
  0 siblings, 2 replies; 6+ messages in thread
From: Sweth Chandramouli @ 1998-08-10  1:02 UTC (permalink / raw)
  To: ZSH Users

On Sun, Aug 09, 1998 at 03:04:41PM -0700, Bart Schaefer wrote:
> On Aug 9,  3:08pm, Sweth Chandramouli wrote:
> Yes, I did say that, but Greg Badros <gjb@cs.washington.edu> pointed
> out that I should have said that INTERACTIVE was tested, not NO_RCS.
> He included a pointer to a flow chart:
> 
> http://www.cs.washington.edu/homes/gjb/ToolsTalks/unix-shell/img009.GIF
	hmm... i've actually still got both of those messages archived,
and i don't find INTERACTIVE mentioned in either.  

[snip]
> Where do you find that in the man page?  My "man zshoptions" under
> INTERACTIVE says, "The value of this option cannot be changed anywhere
> other than the command line."
> 
> } the tests given in the STARTUP FILES section of the manpage
> } for a login shell (-l or -zsh) aren't true for any of my login
> } shells
> 
> How are you determining this?  What does "echo $0" at a PS1 prompt show?
	that i need to read the manpages better.
	i totally misread the part about changing interactive (too many hours
staring at a screen, i guess), and my shell is defined as a login one because
its argv[0] is `-zsh'.  i assumed it didn't because of the info in the faq on
changing your shell, which mentioned linking it to -zsh; echo $0 shows that
i am running -zsh, even though i never made that link.  does login somehow
invoke the shell and pass it a modified argv[0]?
	regardless, here is my revised list of tests for the sourcing of
the various rc files.  i'm not including the chart itself--it's at 
http://astaroth.nit.gwu.edu/~sweth/geek/zshinit.html if people want to
see it; for those who don't, test one returns [no] if rc files are enabled, 
test two returns [no] if the shell isn't a login shell, and test three 
returns [no] if the shell isn't interactive.  so, do these look right, or 
am i missing anything else? 
	also, while figuring all of these out, a few things occurred to me.
for one, does it make sense for the precedence of `unsetopt RCS' to be
different from that of `setopt RCS' in test one?  everywhere else, the
inversions of options seem to have the same precedence as each other.
secondly, is there any way to ensure that an action will be taken for all
users upon logout?  since test one is repeated just before sourcing
$ZDOTDIR/.zlogout and /etc/zlogout, any user can just put `set NO_RCS' in
his/her $ZDOTDIR/.zlogin, which is the last RC to be sourced, and avoid
sourcing /etc/zlogout.  finally, what is the purpose of the `+i' flag?
`zsh +i' doesn't spawn a non-interactive shell (which would, i would
imagine, immediately exit without some source of input), but instead
spawns a shell where the only option set is SHIN_STDIN, but which is
still interactive (and which ignores PROMPT, it seems).

	-- sweth.

-----
`unsetopt OPTION' is equivalent to `setopt NO_OPTION' and `unsetopt
NO_OPTION' is equivalent to `setopt OPTION' in terms of precedence.
For example, zsh -f with `unsetopt NO_RCS' in /etc/zshenv will source
/etc/zshenv, $ZDOTDIR/.zshenv, /etc/zshrc, and $ZDOTDIR/.zshrc.

[1]   DEFAULT--rc-enabled shell                 => [no]
      `setopt NO_RCS' called before test        => [yes]
      `+f' flag present on shell invocation     => [no]
      `-f' flag present on shell invocation     => [yes]
      `setopt RCS' called before test           => [no]

[2]   DEFAULT--non-login shell                  => [no]
      first character of argv[0] is `-'         => [yes]
      `+l' flag present on shell invocation     => [no]
      `-l' flag present on shell invocation     => [yes]
      `setopt NO_LOGIN' called before test      => [no]
      `setopt LOGIN' called before test         => [yes]

[3]   DEFAULT--non-interactive shell            => [no]
      stdin is a tty (isatty(0) is true)        => [yes]
      `-c' flag present on shell invocation     => [no]
      `-s' flag present on shell invocation     => [yes]
      `+s' flag present on shell invocation     => [no]
      `-i' flag present on shell invocation     => [yes]
      `+i' flag present on shell invocation     => [no]

-- 
Sweth Chandramouli
IS Coordinator, The George Washington University
<sweth@gwu.edu> / (202) 994 - 8521 (V) / (202) 994 - 0458 (F)
<a href="http://astaroth.nit.gwu.edu/~sweth/disc.html">*</a>


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: init files
  1998-08-10  1:02   ` Sweth Chandramouli
@ 1998-08-10  3:51     ` Bart Schaefer
  1998-08-15 17:24       ` Bart Schaefer
  1998-08-10  9:13     ` Zefram
  1 sibling, 1 reply; 6+ messages in thread
From: Bart Schaefer @ 1998-08-10  3:51 UTC (permalink / raw)
  To: Sweth Chandramouli, ZSH Users

On Aug 9,  9:02pm, Sweth Chandramouli wrote:
} Subject: Re: Re: init files
}
} 	regardless, here is my revised list of tests for the sourcing of
} the various rc files.  [...]  do these look right, or 
} am i missing anything else?

They're all more complicated than they need to be.  The tests zsh does
are very simple:
	[1] Is RCS unset?
	[2] Is LOGIN set?
	[3] Is INTERACTIVE set?

Everything else you include in your lists simply determines the state of
those three options.

} for one, does it make sense for the precedence of `unsetopt RCS' to be
} different from that of `setopt RCS' in test one?  everywhere else, the
} inversions of options seem to have the same precedence as each other.

I don't quite understand what you mean by "precedence."  Any setopt or
unsetopt that happens in /etc/zshenv can change the command line options,
except for -i/+i.  The command line options can change the defaults or
the values determined by tests like isatty(0).  That's all there is.

If you mean that the lists under each of your test numbers are supposed
to be in some sort of order, then you have the order wrong.

[1]   DEFAULT--rc-enabled shell                 => RCS
        unless
      `-f' flag present on shell invocation     => NO_RCS
        unless
      `+f' flag present on shell invocation     => RCS
        unless
    ( `unsetopt RCS' called in /etc/zshenv      => NO_RCS
        or
      `setopt RCS' called in /etc/zshenv        => RCS )

[2]   DEFAULT--non-login shell                  => NO_LOGIN
        unless
      first character of argv[0] is `-'         => LOGIN
        unless
    ( `+l' flag present on shell invocation     => NO_LOGIN
        or
      `-l' flag present on shell invocation     => LOGIN )
        unless
    ( `unsetopt LOGIN' called before test       => NO_LOGIN
        or
      `setopt LOGIN' called before test         => LOGIN )

[3]   DEFAULT--non-interactive shell            => NO_INTERACTIVE
        unless
      stdin is a tty (isatty(0) is true)        => INTERACTIVE
        unless
      script name present on shell invocation   => NO_INTERACTIVE
        unless
      `-s' flag present on shell invocation     => INTERACTIVE
           *and* stdin is a tty
	unless
      `-c' flag present on shell invocation     => NO_INTERACTIVE
        unless
    ( `-i' flag present on shell invocation     => INTERACTIVE
        or
      `+i' flag present on shell invocation     => NO_INTERACTIVE )

Note that there are two "oddities" here:  First, +f always wins over -f
when both appear, no matter in what order; for all the other flags,
whichever one comes last wins.  I don't know why this is.  Second, +s
cannot unset SHINSTDIN when there is no other possible source of input,
which is why I listed "script name present" instead of +s.

} secondly, is there any way to ensure that an action will be taken for all
} users upon logout?

Not really; you summed up the situation accurately.

} finally, what is the purpose of the `+i' flag?
} `zsh +i' doesn't spawn a non-interactive shell (which would, i would
} imagine, immediately exit without some source of input), but instead
} spawns a shell where the only option set is SHIN_STDIN, but which is
} still interactive (and which ignores PROMPT, it seems).

You're confusing "interactive" with "reads from the tty."  A shell that
doesn't prompt is not "interactive."  It's reading commands from stdin,
and stdin happens to be a tty, but the shell doesn't care.  You'll note
that it doesn't do other interactive things either, e.g., it ignores the
CORRECT option, it won't let you setopt ZLE, and if you type ctrl-Z you
suspend the whole shell.

As for what the purpose is, well, I can come up with only rather far-
fetched examples of cases when you might use it, but it's there just in
case.

-- 
Bart Schaefer                                 Brass Lantern Enterprises
http://www.well.com/user/barts              http://www.brasslantern.com


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Re: init files
  1998-08-10  1:02   ` Sweth Chandramouli
  1998-08-10  3:51     ` Bart Schaefer
@ 1998-08-10  9:13     ` Zefram
  1 sibling, 0 replies; 6+ messages in thread
From: Zefram @ 1998-08-10  9:13 UTC (permalink / raw)
  To: Sweth Chandramouli; +Cc: zsh-users

Sweth Chandramouli wrote:
>	i totally misread the part about changing interactive (too many hours
>staring at a screen, i guess), and my shell is defined as a login one because
>its argv[0] is `-zsh'.  i assumed it didn't because of the info in the faq on
>changing your shell, which mentioned linking it to -zsh; echo $0 shows that
>i am running -zsh, even though i never made that link.  does login somehow
>invoke the shell and pass it a modified argv[0]?

Yes.  login always adds the "-" when invoking the user's shell.

>secondly, is there any way to ensure that an action will be taken for all
>users upon logout?

Yes.  Modify login to invoke the command when the login shell terminates.
Any method based on the user's shell performing the action can be
trivially circumvented.

-zefram


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: init files
  1998-08-10  3:51     ` Bart Schaefer
@ 1998-08-15 17:24       ` Bart Schaefer
  0 siblings, 0 replies; 6+ messages in thread
From: Bart Schaefer @ 1998-08-15 17:24 UTC (permalink / raw)
  To: Sweth Chandramouli, ZSH Users

On Aug 9,  8:51pm, I wrote:
} Subject: Re: init files
}
} [1]   DEFAULT--rc-enabled shell                 => RCS
}         unless
}       `-f' flag present on shell invocation     => NO_RCS
}         unless
}       `+f' flag present on shell invocation     => RCS
}         unless
}     ( `unsetopt RCS' called in /etc/zshenv      => NO_RCS
}         or
}       `setopt RCS' called in /etc/zshenv        => RCS )
} 
} Note that there are two "oddities" here:  First, +f always wins over -f

This turns out not to be true; I was misled by some setopts in /etc/zshenv,
which I've since deleted.  It should read:

[1]   DEFAULT--rc-enabled shell                 => RCS
        unless
    ( `-f' flag present on shell invocation     => NO_RCS
        or
      `+f' flag present on shell invocation     => RCS )
        unless
    ( `unsetopt RCS' called in /etc/zshenv      => NO_RCS
        or
      `setopt RCS' called in /etc/zshenv        => RCS )

-- 
Bart Schaefer                                 Brass Lantern Enterprises
http://www.well.com/user/barts              http://www.brasslantern.com


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~1998-08-15 17:36 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
1998-08-09 19:08 init files Sweth Chandramouli
1998-08-09 22:04 ` Bart Schaefer
1998-08-10  1:02   ` Sweth Chandramouli
1998-08-10  3:51     ` Bart Schaefer
1998-08-15 17:24       ` Bart Schaefer
1998-08-10  9:13     ` Zefram

Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).