Yes, I had actually using 'read -u3 -r ...' and then I thought I'd better do
a little checking before posting, so I tested without using fd3 and with other
fd's. No difference. But it looks like I forgot to fix up the original
example before hitting Send. Sorry about that.
--
Rick
On May 9, 2012, at 4:04 PM, Mario DeFazio wrote:
> Hi Rick,
>
> This may or may not have anything to do with your issue,
> but I am curious: In your main while loop,
> why aren't you using 'read -u3', e.g.
>
> while read -u3 -r ...
>
> instead of this redirection
>
> done < "${tmpfile}"
>
> since you already opened that file to unit 3 with exec?
>
> -Mario
>
>
>
>
> On 5/9/2012 5:50 PM, Rick Robino wrote:
>> Hello,
>>
>> I noticed that I get different values for a variable at the end of a loop
>> when I follow the close of the loop with a pipe to tee(1) instead of a
>> redirect to a file. Specifically, if I increment values in the loop and
>> then redirect the output of the loop, the value after processing is what had
>> been incremented during the loop. Conversely, if I pipe to tee instead of
>> redirecting then I get the pre-loop value of the variable instead of the
>> value that incremented in the loop. In both cases the value increments,
>> it's just what I get after the loop has finished that changes depending on
>> how I handle the output.
>>
>> There is probably a logical explanation for this, and that is what I am
>> seeking with his post to the list. It doesn't make any difference what file
>> descriptor I read from. Below is some sample code that exhibits the
>> behavior that I don't understand. Change line 16 from "| tee -a
>> logfile.txt" to "> logfile.txt" to elicit the behavior that I was expecting.
>>
>> 1 errors=100
>> 2 tmpfile=$( mktemp '/tmp/x.XXXXX' )
>> 3
>>
>> 4 for ((i=0;i<10;i++))
>> 5 do print 'a'
>> 6 done> $tmpfile
>> 7
>>
>> 8 print "(pre-loop) errors: $errors"
>> 9
>>
>> 10 exec 3<"${tmpfile}"
>> 11 while read -r -- tok1 tok2 discard
>> 12 do
>> 13 if [[ -z $tok1 ]] || [[ -z $tok2 ]]
>> 14 then
>> 15 ((errors++))
>> 16 fi
>> 17 print "(in-loop) errors: $errors"
>> 18 done< "${tmpfile}" | tee -a logfile.txt
>> 19 exec 3<&-
>> 20
>>
>> 21 print "(post-loop) errors: $errors"
>> 22 whence -v ksh
>> 23 whence -v tee
>> 24 print ${.sh.version}
>>
>> Output from the above:
>>
>> (pre-loop) errors: 100
>> (in-loop) errors: 101
>> (in-loop) errors: 102
>> (in-loop) errors: 103
>> (in-loop) errors: 104
>> (in-loop) errors: 105
>> (in-loop) errors: 106
>> (in-loop) errors: 107
>> (in-loop) errors: 108
>> (in-loop) errors: 109
>> (in-loop) errors: 110
>> (post-loop) errors: 100
>> ksh is a tracked alias for /opt/ast/bin/ksh
>> tee is a tracked alias for /opt/ast/bin/tee
>> Version M 1993-12-28 s+
>>
>>
>> Thanks in advance for helping me understand this.
>>
_______________________________________________
ast-users mailing list
[email protected]
https://mailman.research.att.com/mailman/listinfo/ast-users