hi, first of all apologies for this long mail...
I have two questions where I hope for some clarification from the list (did not find the answers in manpage or the "canonical" book): I use field splitting with non-default values for IFS in one of my scripts within a new-type function definition supporting local variables. I define locally within the function body something like typeset IFS=, and do my field splitting. after this is completed I do unset IFS which I presumed would make the global definition of IFS visible again for the rest of the function. but this is not the case (neither for this special variable nor for any other globally defined variable): the locally reported value is the null string. so my first question is 1. why does the value of a global variable become only visible again after leaving the function even if the local variable of the same name is explicitly `unset'? I would have thought the global value is only masked by the local variable as long as the letter is actually in existence (not yet unset). more important to me is the the following IFS specific point, however, which occurs independent of whether IFS is used locally within the function or globally outside of any function: after I do unset IFS field splitting still occurs using the default value of IFS (which however, is no longer visible to the user after the unset, e.g. print "$IFS" | od -bc shows nothing). when doing the `unset' within the function (with the locally defined IFS) I assumed that the `unset' would make the global definition visible again and that, therefore, field splitting _would_ happen normally but a) the global IFS does in fact not become visible again before leaving the function (see above) and b) the same happens at the top level (outside of any function). if instead I do IFS= no further field splitting occurs (as expected). if this description is unclear, here's an example: 8<---------------------------------------------- s=$'a,b c\td' print ">>$s<<" set $s print "default IFS" print -n "$IFS"|od -bc cnt=1 for i in "$@"; do print '$'$((cnt++)): ">>$i<<"; done IFS= [[ "$IFS" ]] || echo null set $s print "IFS set to null string" print -n "$IFS"|od -bc cnt=1 for i in "$@"; do print '$'$((cnt++)): ">>$i<<"; done unset IFS [[ "$IFS" ]] || echo null set $s print "IFS unset" print -n "$IFS"|od -bc cnt=1 for i in "$@"; do print '$'$((cnt++)): ">>$i<<"; done 8<---------------------------------------------- obviously `unset IFS' restores the default value of IFS. however, the default value is no longer "visible" to the user (test for string length yields zero etc.). ultimately, my second question is: 2. is there a way for the user to know whether `unset IFS' or `IFS=' was issued "upstream" (apart from looking at the result of an attempted field split...)? and if `unset IFS' silently restores the default value, why is this not reflected by `print' or the result of an appropriate `test'? thanks in advance joerg _______________________________________________ ast-users mailing list [email protected] http://lists.research.att.com/mailman/listinfo/ast-users
