From owner-freebsd-hackers@FreeBSD.ORG Sat Sep 28 16:49:16 2013 Return-Path: Delivered-To: freebsd-hackers@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 95D973A8; Sat, 28 Sep 2013 16:49:16 +0000 (UTC) (envelope-from ian@FreeBSD.org) Received: from mho-01-ewr.mailhop.org (mho-03-ewr.mailhop.org [204.13.248.66]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 57B2F260B; Sat, 28 Sep 2013 16:49:16 +0000 (UTC) Received: from c-24-8-230-52.hsd1.co.comcast.net ([24.8.230.52] helo=damnhippie.dyndns.org) by mho-01-ewr.mailhop.org with esmtpsa (TLSv1:AES256-SHA:256) (Exim 4.72) (envelope-from ) id 1VPxhd-000PAN-Fl; Sat, 28 Sep 2013 16:49:09 +0000 Received: from [172.22.42.240] (revolution.hippie.lan [172.22.42.240]) by damnhippie.dyndns.org (8.14.3/8.14.3) with ESMTP id r8SGn5nP007861; Sat, 28 Sep 2013 10:49:05 -0600 (MDT) (envelope-from ian@FreeBSD.org) X-Mail-Handler: Dyn Standard SMTP by Dyn X-Originating-IP: 24.8.230.52 X-Report-Abuse-To: abuse@dyndns.com (see http://www.dyndns.com/services/sendlabs/outbound_abuse.html for abuse reporting information) X-MHO-User: U2FsdGVkX19Kzbuco+n+PFyfLNRjdbL5 Subject: Re: Trying to use /bin/sh From: Ian Lepore To: Devin Teske In-Reply-To: <13CA24D6AB415D428143D44749F57D720FC05A80@LTCFISWMSGMB21.FNFIS.com> References: <1380309632.84323.3.camel@localhost> <20130927221459.GA27990@stack.nl> <52468F62.6010404@freebsd.org> <13CA24D6AB415D428143D44749F57D720FC05A80@LTCFISWMSGMB21.FNFIS.com> Content-Type: text/plain; charset="us-ascii" Date: Sat, 28 Sep 2013 10:49:05 -0600 Message-ID: <1380386945.1197.327.camel@revolution.hippie.lan> Mime-Version: 1.0 X-Mailer: Evolution 2.32.1 FreeBSD GNOME Team Port Content-Transfer-Encoding: 7bit Cc: FreeBSD Hackers X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 28 Sep 2013 16:49:16 -0000 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