On Tue, May 08, 2007 at 13:51:01 -0700, Randal L. Schwartz wrote: > >>>>> "Jim" == Jim Meyering <jim@xxxxxxxxxxxx> writes: > > Jim> Not that it matters (or maybe this is a feature :-), because people > Jim> who create such files in their working directory deserve what they > Jim> get, Eh? :-) > > The problem is the newline in the string, since > > git-ls-files --others --directory $excl ${excl_info:+"$excl_info"} -- "$@" | > while read -r file; do > > is using newline as a delimiter. Any file with a newline would mess this up. > > Not being a shell programming expert, is there a way we could use -z and xargs > -0 here instead? Unfortunately read does not have zero-delimited mode (at all). Unfortunately the backquote expansion does not preserve whitespace correctly, so it's not possible to use something like head. Unfortunately there does not seem to be a way to feed newline to read (without -r flag), because the rules say that '\<NL>' => '' and '\<something>' => '<something>'. Than I can't think of anything other than xargs -0. Unfortunately that is an external command, which only handles simple commands. So the question becomes how to give it a simple command. Well, there would be two ways: - A simple command might be: sh -c 'arbitrarily complex command' dummy arguments... (the "dummy" will become $0), so you can simply put the whole loop in single quotes, use for file; do instead of while read -r file; do and be done. - Reinvoke the program with special argument meaning it should run the inner loop. Ie. add an option --inner-loop option, that would run the inner loop and terminate and use xargs -0 "$0" --inner-loop Both solutions require exporting all the necessary variables. -- Jan 'Bulb' Hudec <bulb@xxxxxx>
Attachment:
signature.asc
Description: Digital signature