bug-bash
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Command grouping


From:
Subject: Re: Command grouping
Date: Sun, 13 Oct 2019 10:54:49 +0100

On Sun, 13 Oct 2019 10:09:26 +0200
Mischa Baars <mjbaars1977.bug-bash@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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]