Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 12 Jun 2002 17:41:11 -0400
From:      parv <parv@pair.com>
To:        Joe Kelsey <joek@mail.flyingcroc.net>
Cc:        freebsd-bugs@FreeBSD.org
Subject:   Re: bin/39198: sh aborts on variables with periods
Message-ID:  <20020612214110.GA30199@moo.holy.cow>
In-Reply-To: <200206122010.g5CKA3L09165@freefall.freebsd.org>
References:  <200206122010.g5CKA3L09165@freefall.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
in message <200206122010.g5CKA3L09165@freefall.freebsd.org>,
wrote Joe Kelsey thusly...
>
> The following reply was made to PR bin/39198; it has been noted by GNATS.
>
> From: Joe Kelsey <joek@mail.flyingcroc.net>
>
>  Matthias Buelow wrote:
>
>  > Joe Kelsey wrote:
>  >
>  >> /bin/sh does not gracefully accept variables with periods.
>  >
>  >
>  > Neither does ksh88, the direct predecessor to ksh93...
>  >
>  >> Either /bin/sh has to allow parameters to contain periods or
>  >> it has to provide a reliable method of detecting /bin/sh
>  >> versus ksh.
>  >
>  > Try to check for RANDOM, which does not exist on sh.  ...
>  > Similarly probably for zsh.  Then try to check for KSH_VERSION
>  > to draw the line between ksh and pdksh.
>  >
>  ... I just want to separate generic ksh from /bin/sh, and RANDOM
>  should do that.  The check for KSH_VERSION fails in ksh93 since
>  they went to the .sh.version parameter and dropped KSH_VERSION
>  completely, a real killer.

i was in a similar situation which resulted in a thread on
comp.unix.shell titled "of ~/.profile, bourne shell, and ksh93's
${.sh.version}".  in addition to that, i also got a private reply...


----  quote  ----
A test like the following can be used to recognize non-ksh/non-bash 
shells.  I.e. bourne/csh

    if test $RANDOM = $RANDOM
    then
        bsh/csh
    else
        ksh/bash
    fi

For determining ksh88 vs ksh93, and which version of ksh93, I define 2
functions which are in an FPATH directory.

####   isksh93  ####

function isksh93 {
        { : ${.sh.version} ; } >/dev/null 2>&1
        return $?
}

####   kshversion   ####

function kshversion
{
        exec 7>&2 2>/dev/null
        typeset ver rtrn
        ver=`echo ${.sh.version}`
        rtrn=$?
        echo "${ver}" | sed -e 's/Version M[-/0-9 ]*//' -e 's/[ $       
]*$//'
        exec 2>&7 7>&-

        return $rtrn
}

# Most ksh's output a version string (invoked with <Esc><Ctrl> V)
# of the form:
#       Version M 1993-12-28 k+
#       Version M-12/28/93d
#       Version M-11/16/88i
# ksh93's also have the same string in a special variable .sh.version
# that ksh88 considers an invalid variable name.
#
# kshversion gives two types of information, return status and stdout
#
#    shell type     return status      stdout
#    ----------     -------------      ------
#      ksh88             1             probably nothing
#      ksh93             0             the version letter ...
#
# Note, this is done with emperical tests, no certainty what will
# happen with untested ksh versions
----  unquote  ----


hth.

  - parv

--


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20020612214110.GA30199>