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

Re: Configuration of IceWm for the OpenBSD 3.5



Greg (runman_(_at_)_speedfactory_(_dot_)_net) wrote:

> I may be incorrect, but I think that the machine starts up, loads the
> kernel, goes through the rc scripts, setting the $PATH variable (inclusive
> of /usr/local/bin), then X starts up, then xdm, the login screen is
> displayed, X refers to .xsession in the ~ (or home) directory to start up
> the window manager, which then refers to .icewm (in my case).

You were half right: you're incorrect. ;-)   (But you're pretty close.)

If you login on a text console, you get a login shell.  This means
your shell (whatever's in /etc/passwd) is invoked with a "-" in front
of its name, which is an ancient hack going back to the 1970s.  This
in turns causes the shell to behave differently than it normally does:
it reads files that are only to be read on logins.  For ksh or bash,
this means /etc/profile first, and then ~/.bash_profile (for bash, if
it exists), or ~/.profile (otherwise).

A normal (non-login) bash shell reads ~/.bashrc instead of those files.
A normal (non-login) ksh reads whatever file is pointed to by the
environment variable $ENV.  Many people set this to ~/.kshrc but that's
not mandatory.

Logging in with sshd is just the same.  You get a login shell.

XDM, however, is an entirely different animal.  When you login that
way, you don't have a normal shell -- you have an X session instead.
XDM reads ~/.xsession (which is a shell script) if that file exists,
to determine what programs should be run.  When ~/.xsession terminates,
your X session terminates, and you're logged out.  The X server is
terminated, and XDM respawns a new one, and draws a login box.

This means that XDM logins do *not* read /etc/profile or ~/.profile or
~/.tcshrc or ~/.login or any other file that shells read.  Those
dot-files are for shells, and specifially for shells that are running
on terminals -- people often put things like "stty" and "fortune" in
them, and those wouldn't work without a terminal.

If your ~/.profile is safe to run on non-terminals (either because you
don't have any terminal-using programs in it at all, or because you
protected any tty code with "if test -t 0" or equivalent), then you
can "dot in" ~/.profile from ~/.xsession in order to get your familiar
environment when you login with XDM.  The same goes for /etc/profile
or whatever else you want to dot in.  It's all under your control.

If you don't have a ~/.xsession file, then a system-wide default X
session is used instead.  This will usually have some reasonable
default behavior, such as "run xrdb if the user has a ~/.Xdefaults
file, then run xterm &, then exec a window manager".  I don't run
X on OpenBSD so I'm not sure what OpenBSD's default X session looks
like.

When you open an xterm, you get a normal (non-login) shell in it.
This means it doesn't read /etc/profile and so on, unless you specified
the "-ls" option to xterm.  If your shell is bash, then the shell you
get in an xterm will read ~/.bashrc (see the man page for your shell
if you don't know what behavior it exhibits).

So, here's what I recommend:

 1) Put your environment variables ($PATH etc.) in ~/.profile.
 2) Sanitize ~/.profile so that it doesn't barf if you run it without a
    terminal.
 3) Dot in ~/.profile from ~/.xsession (and then run whatever other X
    programs you want, including and ending with your window manager).
 4) Put transient shell code like aliases, functions, "set -o vi", and
    so on in ~/.bashrc (if you use bash; otherwise ~/.kshrc, but make
    sure you export ENV=$HOME/.kshrc in ~/.profile in that case).
 5) Dot in ~/.bashrc at the end of ~/.profile (if you use bash).
 6) If you use csh, stop it.  It's horrible. ;-)

-- 
Greg Wooledge                  |   "Truth belongs to everybody."
greg_(_at_)_wooledge_(_dot_)_org              |    - The Red Hot Chili Peppers
http://wooledge.org/~greg/     |