NetBSD-Bugs archive

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

Re: bin/53919: please revert changes that make /bin/sh evaluate $ENV non-interactively

The following reply was made to PR bin/53919; it has been noted by GNATS.

From: "Greg A. Woods" <>
Subject: Re: bin/53919: please revert changes that make /bin/sh evaluate $ENV non-interactively
Date: Tue, 29 Jan 2019 10:51:27 -0800

 Content-Type: text/plain; charset=US-ASCII
 At Tue, 29 Jan 2019 06:45:01 +0000 (UTC), Robert Elz <kre%munnari.OZ.AU@localhost> wrote:
 Subject: Re: bin/53919: please revert changes that make /bin/sh evaluate $ENV non-interactively
 >  Your usage has always been broken, it just has not affected you
 >  until now.
 Broken?  I think not.  It just hasn't ever interacted so horribly with
 NetBSD /bin/sh (or any other POSIX-ish system shell) ever before.  I've
 installed and used Ksh or something compatible enough on almost all of
 the extremely many and varied systems I've used since 1985, and I've
 used the same $ENV setting since before 1993, and I've never seen any
 other system shell misbehave when faced with any aspect of my Ksh
 environment.  It is though somehow pleasant to see a situation where the
 REPL of a system's /bin/sh isn't entirely useless to Ksh users (which of
 course has been more or less true of NetBSD's /bin/sh since 1.0).
 However I'd like to prevent any /bin/sh in any current or future NetBSD
 release from being the first to so misbehave.
 So, with a bit more debugging, I see that the fundamental reason NetBSD
 /bin/sh hasn't been a problem for Korn and Korn-like Shell users since
 growing its $ENV hack is that it has been silently failing to do
 anything with David Korn's long-recommended setting for $ENV.  Here's
 why, from ktrace+kdump:
  13571      1 sh       CALL  open(0x7f7ffffffb6d,0,0x7f7ffde06440)
  13571      1 sh       NAMI  "${ENVFILE[(_$-=1)+(_=0)-(_$-!=_${-%%*i*})]}"
  13571      1 sh       RET   open -1 errno 2 No such file or directory
 However this failure is silent and un-obtrusive, and efficient.
 Now that I see this clearly in this context it makes perfect sense.
 So, the thing that made my new -current system entirely unusable was a
 new error message, and the most frustrating thing was the futility and
 uselessness of that feckless error message.
 One thing is certain:  The $ENV form using arrays is not going away.  It
 has worked for 30+ years, and is widely recommended, including in the
 "The Kornshell" book (since 1989).  This method has worked A-OK with
 _all_ Ksh derivatives I've ever encountered, including even Zsh (older
 Zsh, that is, IIRC -- newer Zsh is, if I'm not mistaken, even more Ksh
 compatible).  Even if I'm willing to change my own interactive shell
 settings, there's no changing the behaviour of shells that now prevail
 in the vast enormous majority of all other systems in the world.
 I'm rather sad that the POSIX committee was somehow able to justify, at
 least to to themselves, a half-baked appropriation of this ancient Ksh
 feature.  But that's water under the bridge.  (Perhaps I'm most sad that
 I personally wasn't able to be more involved in POSIX, but that's also
 flowed long ago into sea of time.)
 So I think I would be happy enough if /bin/sh guaranteed never to make a
 peep about $ENV expansion or open() failures in all normal circumstances.
 (i.e. maintain the status quo of behaviour in existing releases).
 Of course I would also be happy if there were some command-line flag
 that made the shell very noisy about $ENV issues.  Perhaps "-x" would
 suffice, though I see it is already quelled by read_profile(), so
 something stronger would probably be needed for profile and ENV file
 >  A better solution for your problem, which should be much more
 >  portable, is simply to make $ENV be a very short file, that determines
 >  whether it should be used at all (if you don't want it in non-interactive
 >  shells, it should simply return) and then determines which shell is
 >  being run [[...]]
 Sorry, I don't think that is a better solution at all.  It's a bad
 (inefficient) hack.  Change for the better is fine, but not change for
 the worse.
 The only good solution is to do something smart during the runtime
 expansion of $ENV to prevent the open from occurring or at least from
 succeeding, just as Korn suggested in the beginning.  I think I could
 come up with a new hack to be compatible with a no-arrays shell, but as
 I said, the arrays method simply isn't ever going away in wider circles.
 					Greg A. Woods <>
 +1 250 762-7675                           RoboHack <>
 Planix, Inc. <>     Avoncote Farms <>
 Content-Type: application/pgp-signature
 Content-Transfer-Encoding: 7bit
 Content-Description: OpenPGP Digital Signature

Home | Main Index | Thread Index | Old Index