Path: utzoo!mnetor!uunet!husc6!hao!gatech!uflorida!codas!cpsc6a!atl2!akgua!mtunx!whuts!homxb!houdi!marty1 From: marty1@houdi.UUCP (M.BRILLIANT) Newsgroups: comp.sys.att Subject: Re: Curious ksh hack Message-ID: <1486@houdi.UUCP> Date: 11 Mar 88 22:21:56 GMT References: <340@manta.UUCP> Organization: AT&T Bell Laboratories, Holmdel Lines: 46 Summary: I know how it works, but I can't make it work In article <340@manta.UUCP>, brant@manta.UUCP (Brant Cheikes) writes: > In a memo by David Korn describing ksh, there is a paragraph that > states: > > "The ENV file can have an undesirable effect on performance.... > .... If you export the startup file name in the > variable START, then setting > > ENV='${START[(_$-=1)+(_=0)-(_$-!=_{-%%*i*})]}' > > will only invoke the startup file for interactive shells since the > subscript evaluates to 0 only if the shell is interactive." > > Now, I've done this and it works, but I can't quite figure out how. I've figured out how, but I can't make it work. The manual entry for ksh says that the subscript in an array parameter, that is, x in $START[x], is evaluated as an arithmetic expression. In arithmetic evaluation, as described under the "let" command, you can put subexpressions in parentheses and use = for arithmetic replacement. In an interactive shell, $- usually evaluates to "is". So the first term in parentheses, (_$-=1), evaluates to 1 but also sets the identifier _is equal to 1. The second term, (_=0), evaluates to zero and sets the identifier _ to zero. The third term is apparently a misprint for (_$-!=_${-%%*i*}). The part before the != evaluates, as previously defined, to 1. The part after the != uses ${..%..} to lop off any trailing substring in $- that contains an i, so that part evaluates to _ (zero) in an interactive shell, but to _$- (=1) in a noninteractive shell. The != is true in an interactive shell, equals 1, but is false in an noninteractive shell, equals zero. The sum of the three terms is zero in an interactive shell but is 1 in a noninteractive shell. The desired effect is achieved if, as it says in the manual entry, "command and parameter substitution is performed on the value [of $ENV] to generate the pathname of the script ...." On my system, substitution doesn't seem to happen, so it doesn't work. M. B. Brilliant Marty AT&T-BL HO 3D-520 (201)-949-1858 Holmdel, NJ 07733 ihnp4!houdi!marty1 Disclaimer: Opinions stated herein are mine unless and until my employer explicitly claims them; then I lose all rights to them.