> > On 11/27/06, David Korn <dgk at research.att.com> wrote:
> > >
> > > > Does ksh93 have a function to handle variables
> > like files? I'd like to
> > > > output sub process data to a variable which
> > should be updated for each
> > > > further write from the child. foo=$(ls -l) sends
> > all output after the
> > > > child terminates but I'd like to run the child in
> > the background and
> > > > $foo always reflects the whole output up to the
> > moment.
> > > >
> > > > Josh
> > >
> > > No, but you can come somewhat close to what I think
> > you are asking
> > > for  using discipline functions.  For example,
> > >
> > >         function foo.set
> > >         {
> > >                 eval "@" |&
> > 
> > I don't grok. What does the eval "@" do?
> 
> While I wouldn't presume to correct dgk (unlike some turkeys that work at 
> M$!),
> especially since I've had little like finding documentation on discipline 
> functi
> ons
> (outside perhaps of an expensive book which I don't have), I wonder if that 
> migh
> t
> not be a typo for  $@ (vice @).  However, I wonder if that would do anything 
> (da
> rn
> if I can tell what the args to a set discipline function are); perhaps it 
> should
>  be
>    eval "${.sh.value}" |&
> 
> 
> 
> > >         }
> > >         function foo.get
> > >         {
> > >                 .sh.value=$foo
> > 
> > isn't this recursive? $foo calls foo.get which uses
> > $foo which calls
> > foo.get which uses...
This was a typo I meant to type $@, not @ but if I had done this
it would be a mistake.  It should be eval "${.sh.value}" |&
as you suggest.

> 
> There seems to be something that prevents recursion within a get discipline 
> func
> tion;
Discipline functions are not called recursively for the same
function, but you can call a get function from within a set discipline 
for the same variable.

In ksh93s, you can call the discipline function with different
subscripts of the same array.
> at least, when I try to play with this, it doesn't hang.  I'm guessing that's 
> ab
> out preserving
> the output already seen; however, it doesn't work, as the value of foo at 
> that p
> oint is
> the command originally assigned to foo (at least with the "Version M 
> 1993-12-28 
> o+"
> that I have to play with).
> 
> 
> > 
> > >                 while   read -t.01  -r -p
> > >                 do      .sh.value+=$REPLY$'\n'
> > >                 done
> > >         }
> > 
> > Why don't you use .sh.value="$(cat foo)" here?
> 
> I think that would only set foo once with all the output rather than update it
> incrementally.  However, neglecting that line that I already said didn't 
> work, I
>  only
> get output not already seen, i.e. if I use
> function foo.set
> {
>         eval "${.sh.value}" |&
> }
> 
> function foo.get
> {
>         .sh.value="${foo}"
>         while read -t .01 -r -p
>         do
>                 .sh.value+="$REPLY"$'\n'
>         done
> }
> 
> and where the command "slow" is something like
> 
> #! /bin/ksh93
> typeset -i x=0
> while ((x<30))
> do
>    print -r -- "$x"
>    sleep 1
>    let x+=1
> done
> 
> if I do
> 
> foo=slow;print -r -- "$foo"
> 
> I might get
> 0
> 1
> 2
> 3
> 
> the first time, and on a subsequent
> print -r -- "$foo"
> 
> get
> 
> 4
> 5
> 6
> 
> and so on.
> 
> Also, insofar as one can only have one |& process at once (as far as I know, 
> not
>  having
> played with them before), the notion of all this is interesting, but arguably 
> no
> t
> all that generalizable.  Not to mention that with the timeout on the read 
> (neede
> d to
> keep it from blocking, I guess), this isn't very efficient, either.

I agree that it is not very efficient since it uses a busy wait.
You can have multiple |& at the same time if you move the file descriptors
with >& p and <& p.
>  
>  
> This message posted from opensolaris.org

David Korn
dgk at research.att.com

Reply via email to