cc:  [email protected]
Subject: Re: [ast-developers] problem with command substitution in here doc,  
autoload function, and FPATH
--------

> I am debugging a ksh problem reported on Linux by one of our customers, and 
> in t
> he process of trying to reduce the testcase to something more manageable I 
> came 
> across some odd behavior.  Different ksh versions behave differently for this 
> ti
> ny testcase (see below).
> 
> The ksh93 version shipped with Oracle and Red Hat Enterprise Linux 5 (Version 
> AJ
> M 93t+ 2010-02-02) prints too many lines of output, and reports the error 
> "redir
> ection failed" when the script tries to print more (when the test script 
> paramet
> er > 6).
> 
> The dtksh version (Version M-12/28/93d) on Solaris 5.10 omits some output.
> 
> The version on an OpenSolaris machine (Version M 93t 2008-11-04) dumps core 
> with
> out any output.
> 
> I found some old Linux ksh binaries here: http://unixlabplus.com/linux-rpm/ . 
>  T
> hese appear to have a problem finding one of the scripts in $PATH, and don't 
> pro
> duce any output, just errors.
> 
> A version built from 
> ftp://fr2.rpmfind.net/linux/ASPLinux/sources/SRPMS.12/ksh-2
> 0070111-1.src.rpm appears to work correctly for this testcase.  It fails on 
> the 
> larger customer testcase.
> 
> 
> ::::::::::::::
> t1
> ::::::::::::::
> export COUNT=${1:-1}
> export FPATH=.
> typeset -fu t2
> 
> cat <<EOF
> $(t2 t3 echo "$COUNT" abcdefghijklmnopqrstuvwxyz )
> $(t2 t3 echo "$COUNT" ABCDEFGHIJKLMNOPQRSTUVWXYZ  "$(t2 t3 call 
> 1234567890123456
> 7890)")
> EOF
> ::::::::::::::
> t2
> ::::::::::::::
> function t2
> {
>          script=${1}.sh
>          shift
>          ${script} $@
> }
> ::::::::::::::
> t3.sh
> ::::::::::::::
> case $1 in
> "echo")
>          i=$2
>          shift 2
>          while [ ${i} -gt 0 ]
>          do
>                  echo "$@ $i"
>                  let i=i-1
>          done
>          ;;
> "call")
>          shift
>          echo $(t2 t3 echo $COUNT ${.sh.version} $@)
>          ;;
> esac
> ::::::::::::::
> 
> 
> Correct output (I believe):
> # /tmp/ksh.2007-01-11 t1 1
> abcdefghijklmnopqrstuvwxyz 1
> ABCDEFGHIJKLMNOPQRSTUVWXYZ Version M 1993-12-28 s 12345678901234567890 1 1
> 
> The EL5 /bin/ksh93 output:
> # /bin/ksh93 t1 1
> abcdefghijklmnopqrstuvwxyz 1
> abcdefghijklmnopqrstuvwxyz 1
> ABCDEFGHIJKLMNOPQRSTUVWXYZ Version AJM 93t+ 2010-02-02 12345678901234567890 1 
> Ve
> rsion AJM 93t+ 2010-02-02 12345678901234567890 1
> Version AJM 93t+ 2010-02-02 12345678901234567890 1 Version AJM 93t+ 
> 2010-02-02 1
> 2345678901234567890 1 1
> ABCDEFGHIJKLMNOPQRSTUVWXYZ Version AJM 93t+ 2010-02-02 12345678901234567890 1 
> Ve
> rsion AJM 93t+ 2010-02-02 12345678901234567890 1 Version AJM 93t+ 2010-02-02 
> 123
> 45678901234567890 1 Version AJM 93t+ 2010-02-02 12345678901234567890 1 1
> # /bin/ksh93 t1 10  | wc
> t1[5]: t2: redirection failed
>        0       0       0
> 
> If I change the path to the script in t2 to ./${script}, the Linux ksh's 
> produce
>  correct output.  That change also makes the EL5 ksh print the correct 
> output.  
> Also, when I move the t3.sh script to a different directory in $PATH, but not 
> in
>  $FPATH, the script produces correct output on EL5:
> 
> # mv t3.sh /tmp
> # PATH=$PATH:/tmp
> # /bin/ksh93 t1 1
> abcdefghijklmnopqrstuvwxyz 1
> ABCDEFGHIJKLMNOPQRSTUVWXYZ Version AJM 93t+ 2010-02-02 12345678901234567890 1 
> 1
> # /bin/ksh93 t1 10|wc
>       20     640    5692
> 
> 
> Solaris output:
> $ PATH=/usr/bin:/tmp
> $ mv t3.sh /tmp
> $ /usr/dt/bin/dtksh t1 1
> abcdefghijklmnopqrstuvwxyz 1
> ABCDEFGHIJKLMNOPQRSTUVWXYZ Version M-12/28/93d 12345678901234567890 1 1
> $ mv /tmp/t3.sh .
> $ /usr/dt/bin/dtksh t1 1
> t1[5]: t2: line 4: t3.sh: not found
> t1[5]: t2: line 4: t3.sh: not found
> t1[5]: t2: line 4: t3.sh: not found
> 
> 
> $ PATH=$PATH:
> $ /usr/dt/bin/dtksh t1 1
> abcdefghijklmnopqrstuvwxyz 1
> ABCDEFGHIJKLMNOPQRSTUVWXYZ 1
> 
> 
> Looks like some bug in FPATH handling is causing io buffer corruption, or a 
> file
>  descriptor mixup?
> 
> Thanks,
> Herbert.
> 

It looks as if you have both t2 and t3.sh in the directory name by FPATH.
Directories named by FPATH, can hold function definitions, built-in
definitions, or type definitions.  Anything else is undefined.

If you put t2 in a separate directory and put this directory in FPATH,
this script should work (at least with ksh93t+).

I will add an error message to ksh93u when it detects that a file
from FPATH did not load the named target.

David Korn
[email protected]
_______________________________________________
ast-developers mailing list
[email protected]
https://mailman.research.att.com/mailman/listinfo/ast-developers

Reply via email to