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