Gentoo Archives: gentoo-dev

From: Steven J Long <slong@××××××××××××××××××.uk>
To: gentoo-dev@l.g.o
Subject: [gentoo-dev] Re: [PATCH eutils] Move remove_libtool_files() from autotools-utils for wider use.
Date: Tue, 29 May 2012 13:45:46
Message-Id: jq2jrp$tc9$
In Reply to: [gentoo-dev] [PATCH eutils] Move remove_libtool_files() from autotools-utils for wider use. by "Michał Górny"
Michał Górny wrote:

> + find "${D}" -type f -name '*.la' -print0 | while read -r -d '' f;
> + rm -f "${f}" || die
> + done
Don't pipe to read like that; it means the final command is in a subshell and "die is /not/ guaranteed to work correctly if called from a subshell environment."[1] More seriously, the script doesn't actually get the correct filenames, despite being written to handle any filename. eg: $ touch $' foo bar \n\t ' $ while read -r -d '' f; do echo "'$f'"; done < <(find . -type f -print0) './ foo bar' You do it like this: while read -rd ''; do f=$REPLY; .. done < <(find "$D" -type f -name '*.la' -print0) eg: $ while read -rd ''; do f=$REPLY; echo "'$f'"; done < <(find . -type f - print0) './ foo bar ' Or use: while IFS= read -rd '' f; do .. if you prefer. See: help read # in a terminal. It's called 'Process Substitution' if anyone wants to read about it in man bash. The classic example with find is to get the list in an array: arr=() while read -rd ''; do arr+=("$REPLY") done < <(find "$dir" -type f .. -print0) (perhaps conditionally though that's usually better done within find which can later be handled on a per-file basis, or passed to: foo "${arr[@]}" ..or if you just want to know whether there is a matching file: if read -rd '' < <(find . -type f -print0); then something matched else nothing did fi They're both things I came up with a few years ago when I was learning from #bash, which you are in dire need of, based on reading git-2.eclass. [1] ( -- #friendly-coders -- We're friendly, but we're not /that/ friendly ;-)