Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: Printing arrays for use with $()



On Aug 12, 10:29am, DervishD wrote:
}
} > But again all of this assumes you can control the caller, which means
} > you could just as easily require IFS=$'\0'.
} 
}     Do you mean something like this?:
} 
}     IFS=$'\0' du -s `myscript`

Yes, except that you need a semicolon ...

    IFS=$'\0'; du -s `myscript`

... which also means that you probably need to save and restore the old
value of IFS.  From that standpoint the "eval" is likely better.

}     I'm thinking about another solution that could be better, since
} sometimes I want to manually review the list before passing it to the
} command (and the scripts generates a *different* list each time is
} called):
} 
}     array=(`myscript args`)

A potential way to do this would be to have myscript print the entire
assignment expression:

    print -r -- array=\( ${(q)array} \)

and then have the caller simply do:

    eval $(myscript args)

} Could I do the above, using 'print -N', and after that forcing
} the split in NULLs? I've tested this (doesn't work):
} 
}     array=(`print -N -- $list`)

This doesn't work because in an array context zsh is going to split on
$IFS during the assignment itself, so you already have the wrong thing
in $array before you even get as far as printing it.  You need to use
a scalar assignment:

    notyetarray=`print -N -- $list`
    array=(${(s:$'\0':)notyetarray})

Or (note the double quotes):

    array=( ${(ps:\0:)"$(print -rN -- $list)"} )

} Any way of doing this without much mess?

The above is about as un-messy as it gets.



Messages sorted by: Reverse Date, Date, Thread, Author