[Bug 1894352] [NEW] bash-completion not working properly with directories with spaces in them when using some commands

Jason 1894352 at bugs.launchpad.net
Sat Sep 5 04:08:03 UTC 2020


Public bug reported:

Good evening!

Unfortunately, I need to report an issue with Ununtu 20.04's bash-
completion (bash_completion version 2.10).  It can't properly expand
directories with spaces when there are multiple options when using some
commands.  Here is an example:

$ mkdir -p "p00p/p00p 1"
$ mkdir -p "p00p/p00p 2"
$ ls -d p00p/p00p\ 1 p00p/p00p\ 2
'p00p/p00p 1'  'p00p/p00p 2'
$ ls p00p/p0<tab><tab> 
p00p 1/ p00p 2/
$ ls p00p/p0<tab>1<tab>   # <-- works: yields the expanded command: ls p00p/p00p\ 1/
$ wine p00p/p0<tab><tab>  # <-- does NOT work: fails to show possible expansions: p00p 1/ p00p 2/
$ wine p00p/p0<tab>1<tab> # <-- does NOT work: fails to expand to: wine p00p/p00p\ 1/

I temporarily fixed it by patching the portion of bash_completion which
invokes plusdirs with the version from my raspberry pi OS
(bash_completion version 2.8).  Here's the patch that fixes it:

--- /usr/share/bash-completion/bash_completion	2020-09-04 20:39:18.453560935 -0700
+++ /home/xxx/bash_completion	2020-09-04 20:39:13.625394958 -0700
@@ -563,37 +559,28 @@
     _tilde "$cur" || return
 
     local -a toks
-    local reset
+    local x reset
 
-    if [[ "$1" == -d ]]; then
         reset=$(shopt -po noglob); set -o noglob
         toks=( $(compgen -d -- "$cur") )
-        IFS=' '; $reset; IFS=$'\n'
-    else
+    eval $reset
+
+    if [[ "$1" != -d ]]; then
         local quoted
         _quote_readline_by_ref "$cur" quoted
 
         # Munge xspec to contain uppercase version too
         # http://thread.gmane.org/gmane.comp.shells.bash.bugs/15294/focus=15306
-        local xspec=${1:+"!*.@($1|${1^^})"} plusdirs=()
-
-        # Use plusdirs to get dir completions if we have a xspec; if we don't,
-        # there's no need, dirs come along with other completions. Don't use
-        # plusdirs quite yet if fallback is in use though, in order to not ruin
-        # the fallback condition with the "plus" dirs.
-        local opts=( -f -X "$xspec" )
-        [[ $xspec ]] && plusdirs=(-o plusdirs)
-        [[ ${COMP_FILEDIR_FALLBACK-} ]] || opts+=( "${plusdirs[@]}" )
-
+        local xspec=${1:+"!*.@($1|${1^^})"}
         reset=$(shopt -po noglob); set -o noglob
-        toks+=( $(compgen "${opts[@]}" -- $quoted) )
-        IFS=' '; $reset; IFS=$'\n'
+        toks+=( $( compgen -f -X "$xspec" -- $quoted ) )
+        eval $reset
 
         # Try without filter if it failed to produce anything and configured to
         [[ -n ${COMP_FILEDIR_FALLBACK:-} && -n "$1" && ${#toks[@]} -lt 1 ]] && {
             reset=$(shopt -po noglob); set -o noglob
-            toks+=( $(compgen -f "${plusdirs[@]}" -- $quoted) )
-            IFS=' '; $reset; IFS=$'\n'
+            toks+=( $( compgen -f -- $quoted ) )
+            eval $reset
         }
     fi

<EOF>

Unfortunately, to apply the patch with patch -p0, I had to type in the
name of the file to patch because the patch I saved was only a subset of
the patch produced by "diff -u -w" and my diff-fu isn't good enough to
know how to fix it.  But, providing the name of the file to be patched
when prompted (/usr/share/bash-completion/bash_completion) made it work
and after I sourced the new file the issue was fixed.

Thus, this appears to be a regression of sorts but my bash programming
skills aren't good enough to fix it myself while ensuring that any
functionality provided by the portions that I replaced isn't lost.

Thank you!

Very sincerely,

Jason A. Pfeil

ProblemType: Bug
DistroRelease: Ubuntu 20.04
Package: bash-completion 1:2.10-1ubuntu1 [modified: usr/share/bash-completion/bash_completion]
ProcVersionSignature: Ubuntu 5.4.0-45.49-generic 5.4.55
Uname: Linux 5.4.0-45-generic x86_64
NonfreeKernelModules: nvidia_modeset nvidia
ApportVersion: 2.20.11-0ubuntu27.8
Architecture: amd64
CasperMD5CheckResult: skip
CurrentDesktop: ubuntu:GNOME
Date: Fri Sep  4 20:50:10 2020
Dependencies:
 
EcryptfsInUse: Yes
InstallationDate: Installed on 2020-08-29 (7 days ago)
InstallationMedia: Ubuntu 20.04.1 LTS "Focal Fossa" - Release amd64 (20200731)
PackageArchitecture: all
ProcEnviron:
 TERM=xterm-256color
 PATH=(custom, no user)
 XDG_RUNTIME_DIR=<set>
 LANG=en_US.UTF-8
 SHELL=/bin/bash
SourcePackage: bash-completion
UpgradeStatus: No upgrade log present (probably fresh install)

** Affects: bash-completion (Ubuntu)
     Importance: Undecided
         Status: New


** Tags: amd64 apport-bug focal

-- 
You received this bug notification because you are a member of Ubuntu
Foundations Bugs, which is subscribed to bash-completion in Ubuntu.
https://bugs.launchpad.net/bugs/1894352

Title:
  bash-completion not working properly with directories with spaces in
  them when using some commands

Status in bash-completion package in Ubuntu:
  New

Bug description:
  Good evening!

  Unfortunately, I need to report an issue with Ununtu 20.04's bash-
  completion (bash_completion version 2.10).  It can't properly expand
  directories with spaces when there are multiple options when using
  some commands.  Here is an example:

  $ mkdir -p "p00p/p00p 1"
  $ mkdir -p "p00p/p00p 2"
  $ ls -d p00p/p00p\ 1 p00p/p00p\ 2
  'p00p/p00p 1'  'p00p/p00p 2'
  $ ls p00p/p0<tab><tab> 
  p00p 1/ p00p 2/
  $ ls p00p/p0<tab>1<tab>   # <-- works: yields the expanded command: ls p00p/p00p\ 1/
  $ wine p00p/p0<tab><tab>  # <-- does NOT work: fails to show possible expansions: p00p 1/ p00p 2/
  $ wine p00p/p0<tab>1<tab> # <-- does NOT work: fails to expand to: wine p00p/p00p\ 1/

  I temporarily fixed it by patching the portion of bash_completion
  which invokes plusdirs with the version from my raspberry pi OS
  (bash_completion version 2.8).  Here's the patch that fixes it:

  --- /usr/share/bash-completion/bash_completion	2020-09-04 20:39:18.453560935 -0700
  +++ /home/xxx/bash_completion	2020-09-04 20:39:13.625394958 -0700
  @@ -563,37 +559,28 @@
       _tilde "$cur" || return
   
       local -a toks
  -    local reset
  +    local x reset
   
  -    if [[ "$1" == -d ]]; then
           reset=$(shopt -po noglob); set -o noglob
           toks=( $(compgen -d -- "$cur") )
  -        IFS=' '; $reset; IFS=$'\n'
  -    else
  +    eval $reset
  +
  +    if [[ "$1" != -d ]]; then
           local quoted
           _quote_readline_by_ref "$cur" quoted
   
           # Munge xspec to contain uppercase version too
           # http://thread.gmane.org/gmane.comp.shells.bash.bugs/15294/focus=15306
  -        local xspec=${1:+"!*.@($1|${1^^})"} plusdirs=()
  -
  -        # Use plusdirs to get dir completions if we have a xspec; if we don't,
  -        # there's no need, dirs come along with other completions. Don't use
  -        # plusdirs quite yet if fallback is in use though, in order to not ruin
  -        # the fallback condition with the "plus" dirs.
  -        local opts=( -f -X "$xspec" )
  -        [[ $xspec ]] && plusdirs=(-o plusdirs)
  -        [[ ${COMP_FILEDIR_FALLBACK-} ]] || opts+=( "${plusdirs[@]}" )
  -
  +        local xspec=${1:+"!*.@($1|${1^^})"}
           reset=$(shopt -po noglob); set -o noglob
  -        toks+=( $(compgen "${opts[@]}" -- $quoted) )
  -        IFS=' '; $reset; IFS=$'\n'
  +        toks+=( $( compgen -f -X "$xspec" -- $quoted ) )
  +        eval $reset
   
           # Try without filter if it failed to produce anything and configured to
           [[ -n ${COMP_FILEDIR_FALLBACK:-} && -n "$1" && ${#toks[@]} -lt 1 ]] && {
               reset=$(shopt -po noglob); set -o noglob
  -            toks+=( $(compgen -f "${plusdirs[@]}" -- $quoted) )
  -            IFS=' '; $reset; IFS=$'\n'
  +            toks+=( $( compgen -f -- $quoted ) )
  +            eval $reset
           }
       fi

  <EOF>

  Unfortunately, to apply the patch with patch -p0, I had to type in the
  name of the file to patch because the patch I saved was only a subset
  of the patch produced by "diff -u -w" and my diff-fu isn't good enough
  to know how to fix it.  But, providing the name of the file to be
  patched when prompted (/usr/share/bash-completion/bash_completion)
  made it work and after I sourced the new file the issue was fixed.

  Thus, this appears to be a regression of sorts but my bash programming
  skills aren't good enough to fix it myself while ensuring that any
  functionality provided by the portions that I replaced isn't lost.

  Thank you!

  Very sincerely,

  Jason A. Pfeil

  ProblemType: Bug
  DistroRelease: Ubuntu 20.04
  Package: bash-completion 1:2.10-1ubuntu1 [modified: usr/share/bash-completion/bash_completion]
  ProcVersionSignature: Ubuntu 5.4.0-45.49-generic 5.4.55
  Uname: Linux 5.4.0-45-generic x86_64
  NonfreeKernelModules: nvidia_modeset nvidia
  ApportVersion: 2.20.11-0ubuntu27.8
  Architecture: amd64
  CasperMD5CheckResult: skip
  CurrentDesktop: ubuntu:GNOME
  Date: Fri Sep  4 20:50:10 2020
  Dependencies:
   
  EcryptfsInUse: Yes
  InstallationDate: Installed on 2020-08-29 (7 days ago)
  InstallationMedia: Ubuntu 20.04.1 LTS "Focal Fossa" - Release amd64 (20200731)
  PackageArchitecture: all
  ProcEnviron:
   TERM=xterm-256color
   PATH=(custom, no user)
   XDG_RUNTIME_DIR=<set>
   LANG=en_US.UTF-8
   SHELL=/bin/bash
  SourcePackage: bash-completion
  UpgradeStatus: No upgrade log present (probably fresh install)

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/bash-completion/+bug/1894352/+subscriptions



More information about the foundations-bugs mailing list