On Sun, Aug 31, 2025 at 07:49:57AM -0600, Stan Marsh wrote:
> (>> == pourko, > == Greg)
> 
> >> Sorry, Greg, but this is no "compound" command, these are separate 
> >> commands:
> >> 
> >> $ shopt -s extglob; echo !(this)
> 
> >That is another case where it fails, correct.
> 
> >However, in your original email, you did indeed have the shopt inside
> >a compound command.  That's why I phrased it the way I did.
> 
> >If you wish, I'll add some additional verbosity to my original warning:
> 
> >   Turning on extglob changes how bash parses its input, and bash parses
> >   line by line.  In addition, bash has to parse compound commands (if,
> >   for, while, functions and so on) as a whole.
> 
> >   The "shopt -s extglob" command must have been parsed and executed
> >   BEFORE the parser tries to use extended globs.
> 
> >   Therefore, you cannot put "shopt -s extglob" on the same line, or
> >   in the same compound command, as any extended glob.
> 
> >   I always advise people that if they're going to use extglob, it should
> >   be done right up at the top of the script, either immediately below
> >   the shebang, or after any mandatory comments that their boss demands
> >   be present.  Definitely before any function declarations or loops.
> 
> This whole thread sounds like a tempest in a teapot; I mean, it is what it 
> is, accept
> it and move on.  Face the fact that the bash (and pretty much any other shell
> language; nothing specific to bash here) parser is line-oriented, even though 
> it does
> have aspects of free-form languages (e.g., C).  It is sort of a mishmash of 
> the two.
> 
> Incidentally, I sometimes run into this if I have an alias that I want to 
> convert to a
> function.  Assume foo is a (complicated) alias and you do:
> 
>     unalias foo;foo() { echo New definition for foo; }
> 
> It no workie...
> 
> But here's the thing: As far as I can tell, extglob is on-by-default - in all 
> the
> versions of bash that I was able to test - so I don't understand why OP is 
> messing
> around with turning it on and off.  Or why Greg is talking about turning it 
> on at the
> top of the script.

Are you referring to the fact that if the "==" or "!=" operater is used
within [[ ... ]], then the pattern is matched as if the extglob shell
option was enabled? (documented for the "[[" keyword)

... because the option is usually not enabled by default (unless some
shell library that you use enables it for you when you start the shell):

$ bash -c 'shopt | grep extglob'
extglob         off

Cheers,



> 
> Notes on the assertion above:
>     1) I do not have a compiled version of 5.3 release, but I tested on 5.3 
> rc2 (the
>       most recent version I have) and it was on-by-default.
>     2) The documentation seems to be out of step.  Under the "shopt" command, 
> extglob
>       does not contain the usual notation of "This option is enabled by 
> default".
> 
>       It should, shouldn't it?
> 
> =================================================================================
> Please do not send me replies to my posts on the list.
> I always read the replies via the web archive, so CC'ing to me is unnecessary.
> 
> When responding to my posts, please try to refrain from giving bureaucratic 
> answers.
> If you have nothing useful to say, then just click Next and go on.

-- 
Matti Andreas Kähäri
Uppsala, Sweden

.

Reply via email to