Trying to use /bin/sh
Ian Lepore
ian at FreeBSD.org
Sat Sep 28 16:49:16 UTC 2013
On Sat, 2013-09-28 at 16:36 +0000, Teske, Devin wrote:
> On Sep 28, 2013, at 1:12 AM, Stefan Esser wrote:
>
> > Am 28.09.2013 00:14, schrieb Jilles Tjoelker:
> >> sh's model of startup files (only login shells use startup files with
> >> fixed names, other interactive shells only use $ENV) assumes that every
> >> session will load /etc/profile and ~/.profile at some point. This
> >> includes graphical sessions. The ENV file typically contains only shell
> >> options, aliases, function definitions and unexported variables but no
> >> environment variables.
> >>
> >> Some graphical environments actually source shell startup files like
> >> ~/.profile when logging in. I remember this from CDE for example. It is
> >> important to have some rule where this should happen to avoid doing it
> >> twice or never in "strange" configurations. As a workaround, I made
> >> ~/.xsession a script interpreted by my login shell and source some
> >> startup files. A problem here is that different login shells have
> >> incompatible startup files.
> >
> > I used to modify Xsession to do the final exec with a forced login
> > shell of the user. This worked for users of all shells.
> >
> > The script identified the shell to use and then used argv0 to start
> > a "login shell" to execute the display manager.
> >
> > A simplified version of my Xsession script is:
> >
> > ------------------------------------------------------------------
> > #!/bin/sh
> >
> > LIB=/usr/local/lib
> >
> > SH=$SHELL
> > [ -n "$SH" ] || SH="/bin/sh"
> > SHNAME=`basename $SH`
> >
> > echo "exec $LIB/xdm/Xsession.real $*" | \
> > /usr/local/bin/argv0 $SH -$SHNAME
> > ------------------------------------------------------------------
> >
> > The argv0 command is part of "sysutils/ucspi-tcp", BTW.
> >
> > This script prepends a "-" to the name of the shell that is
> > started to execute the real "Xsession", which had been renamed
> > to Xession.real.
> >
> > I know that the script could be further simplified by using "modern"
> > variable expansion/substitution commands, but this script was in use
> > some 25 years ago on a variety of Unix systems (SunOS, Ultrix, HP-UX)
> > and I only used the minimal set of Bourne Shell facilities, then.
> >
> > You may want a command to source standard profiles or environment
> > settings before the final exec, in case the users shell does not
> > load them.
> >
>
> In my ~/.fvwm2rc file, this is how I launch an XTerm. This achieves the
> goal of sourcing my profile scripts like a normal login shell while launching
> XTerm(s) in the GUI.
>
> DestroyFunc FvwmXTerm
> AddToFunc FvwmXTerm
> PipeRead '\
> cmd="/usr/bin/xterm"; \
> [ -x "${cmd}" ] || cmd="/usr/X11R6/bin/xterm"; \
> [ -x "${cmd}" ] || cmd="xterm"; \
> cmd="${cmd} -sb -sl 400"; \
> cmd="${cmd} -ls"; \
> cmd="${cmd} -r -si -sk"; \
> cmd="${cmd} -fn \\"-misc-fixed-medium-r-*-*-15-*\\""; \
> echo "+ I Exec exec ${cmd}"'
>
> Essentially producing an XTerm invocation of:
>
> xterm -sb -sl 400 -ls -r -si -sk -fn "-misc-fixed-medium-r-*-*-15-*"
>
> And everytime I launch an XTerm with that, I get my custom prompt set
> by ~/.bash_profile.
>
> Of course, I'm also a TCSH user, so when I flop over to tcsh, I also get
> my custom prompt set by ~/.tcshrc
>
> But failing that... you could actually make your XTerm a login shell with:
>
> xterm -e login
>
> But of course, then you're looking at having to enter credentials.
>
> Perhaps it's just a matter of getting your commands into the right file...
>
> .bash_profile for bash and .tcshrc for tcsh.
For bash the solution I've been using for like 15 years is that
my .bash_profile (used only for a login) contains simply:
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
And everything goes into .bashrc which runs on non-login shell
invocation. I have a few lines of code in .bashrc that have to cope
with things like not blindly adding something to PATH that's already
there[1] but other than that I generally want all the same things to
happen whether its a login shell or not.
I think the bourne-shell equivelent is to have a .profile that just sets
ENV=~/.shrc or similar. (I think someone mentioned that earlier in the
thread.)
[1] for example:
if [[ "$PATH" != *$HOME/bin* && -d $HOME/bin ]] ; then
export PATH=$HOME/bin:$PATH
fi
-- Ian
More information about the freebsd-hackers
mailing list