> However, has any thought (or is there a way already?)
> to read in a bunch of null terminated names from
> the output of such a construct?

Well, there's not a construct to build an array like you mention, but
you can use read and a while loop like this:

while IFS= read -rd '' elem; do
  echo "<$elem>";
done < <(printf '%s\0' a b '1 2 3' $'x y \n z')

Which outputs:

<a>
<b>
<1 2 3>
<x y 
 z>

Now, in more detail:

#      .- This is used to disable leading/trailing whitespace
#      |   trimming.
#      v
while IFS= read -rd '' elem; do
#                    ^.. When you pass an empty string as a
#                        "delimiter" for read, it (read) will read
#                        until it finds a NUL character.
  echo "<$elem>";
done < <(printf '%s\0' a b '1 2 3' $'x y \n z')
#       ^.. we use process substitution ( <(...) ) instead of a
#           normal anonymous pipe in case we want to create some
#           persistent variables.

Just be careful, as written above, it requires each record to end
with a NUL byte. If there's no guarantee of a trailing NUL for each
record, you will have to test if read managed to read one last
element with no trailing NUL, it looks something like this:

while ... read -r ... something; do
  ...
done

[[ $something ]] && ...



-- 
Eduardo Bustamante

Reply via email to