On Sun, 13 Oct 2019 10:09:26 +0200 Mischa Baars <mjbaars1977.bug-b...@cyberfiber.eu> wrote:
> On Sat, 2019-10-12 at 10:42 -0400, Chet Ramey wrote: > > On 10/12/19 9:02 AM, Mischa Baars wrote: > > > Hi, > > > > > > Perhaps to better have a look at this mail, than the previous mail. > > > > > > In trying to group commands, in this case compiler commands, I found some > > > peculiarities while trying different combinations of the 'Internal Field > > > Separator' > > > and the 'Parameter Expansion' operator ${parameter@P}. > > > > I haven't looked at this in any depth, but you should realize that running > > > > declare IFS=$(printf ' \t\n') > > > > will result in IFS being set to space and tab, since command substitution > > removes the trailing newline. Maybe that will make a difference. > > > > Hi Chet, > > The bash manual page tells us that is the default value, nothing special. > > I was trying to remove the whitespace, such that whitespaces are allowed in > project directory names, as was considered the default scenario as far as I > know. You are not removing the whitespace values from IFS. Instead, you are re-asserting the default value of IFS, only with \n missing (for the reason that Chet describes). Given that the output of your find command is newline-delimited, doing so will not end well. Writing IFS=$'\n' may function as you expected. However, this is an intrinsically broken approach to begin with. See https://mywiki.wooledge.org/DontReadLinesWithFor. Instead, consider any of the following options:- * find -exec or -execdir * a for loop that iterates over a glob * a while/read loop that consumes find's output (using -print0, ideally) Your problems are compounded by failing to quote the expansion of i in the course of invoking gcc (lines 4-5), and by the flawed attempt at a workaround (lines 2 and 6-7). See https://mywiki.wooledge.org/BashFAQ/050. Not only that, but the *.c argument conveyed to find should be quoted, so as to inhibit pathname expansion. Here is an example of how one might use for:- shopt -s globstar for i in ./pace/**/*.c; do gcc -o "${i%.c}" "$i" done -- Kerin Millar