bash_completion: Enable extglob while parsing file
authorMichael Hanselmann <hansmi@google.com>
Mon, 24 Sep 2012 13:03:53 +0000 (15:03 +0200)
committerMichael Hanselmann <hansmi@google.com>
Tue, 25 Sep 2012 11:14:28 +0000 (13:14 +0200)
In older versions of GNU Bash extended patterns, such as “@(…)”, are only
available with the “extglob” shell option. As pointed out in [1] and [2],
“extglob” must be enabled while parsing the code. Therefore the flag must be
enabled at the beginning of the script and be reset to its original value at
the end as to not interfere with other code on shell initialization.

[1] http://unix.stackexchange.com/questions/45957
[2] http://mywiki.wooledge.org/glob

Reported by Sascha Lucas.

Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Bernardo Dal Seno <bdalseno@google.com>

autotools/build-bash-completion

index 359f7a8..8687254 100755 (executable)
@@ -639,6 +639,11 @@ def main():
   buf = StringIO()
   sw = utils.ShellWriter(buf, indent=not options.compact)
 
+  # Remember original state of extglob and enable it (required for pattern
+  # matching; must be enabled while parsing script)
+  sw.Write("gnt_shopt_extglob=$(shopt -p extglob || :)")
+  sw.Write("shopt -s extglob")
+
   WritePreamble(sw, not options.compact)
 
   # gnt-* scripts
@@ -656,6 +661,10 @@ def main():
                   not options.compact,
                   opts=burnin.OPTIONS, args=burnin.ARGUMENTS)
 
+  # Reset extglob to original value
+  sw.Write("[[ -n \"$gnt_shopt_extglob\" ]] && $gnt_shopt_extglob")
+  sw.Write("unset gnt_shopt_extglob")
+
   print buf.getvalue()