Bash completion seems to be ignoring what I've typed (it tries to complete, but acts as if there's nothing under the cursor). I know I saw it work on this machine earlier today, but I'm not sure what has changed. Some examples:

cd shows all directories under my current folder:

$ cd co<tab><tab>
cmake/    config/   doc/      examples/ include/  programs/ sandbox/  src/      .svn/     tests/    

Commands like ls and less show all files and directories under my current folder:

$ ls co<tab><tab>
cmake/          config/         .cproject       Doxyfile.in     include/        programs/       README.txt      src/            tests/          
CMakeLists.txt  COPYING.txt     doc/            examples/       mainpage.dox    .project        sandbox/        .svn/           

Even when I try to complete things from a different folder, it gives me only the results for my current folder (telling me that it is completely ignoring what I've typed):

$ cd ~/D<tab><tab>
cmake/    config/   doc/      examples/ include/  programs/ sandbox/  src/      .svn/     tests/    

But it seems to be working fine for commands and variables:

$ if<tab><tab>
if        ifconfig  ifdown    ifnames   ifquery   ifup      
$ echo $P<tab><tab>
$PATH        $PIPESTATUS  $PPID        $PS1         $PS2         $PS4         $PWD         $PYTHONPATH  

I do have this bit in my .bashrc, and I have confirmed that my .bashrc is indeed getting sourced:

if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
    . /etc/bash_completion

I've even tried manually executing that file, but it doesn't fix the problem:

$ . /etc/bash_completion

There was even one point in time where it was working for ls, but was not working for cd ... but I can't replicate that result now.

Update: I also just discovered that I have terminals open from earlier that still work. I ran source .bashrc in one of them and afterwards completion was broken. Here is my .bashrc:

# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples
# Modified by Neil Traft

#source ~/.profile

# Allow globs to expand hidden files
shopt -s dotglob nullglob

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

# don't put duplicate lines or lines starting with space in the history.
# See bash(1) for more options

# append to the history file, don't overwrite it
shopt -s histappend

# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)

# check the window size after each command and, if necessary,
# update the values of LINES and COLUMNS.
shopt -s checkwinsize

# If set, the pattern "**" used in a pathname expansion context will
# match all files and zero or more directories and subdirectories.
#shopt -s globstar

# make less more friendly for non-text input files, see lesspipe(1)
[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"

# set variable identifying the chroot you work in (used in the prompt below)
if [ -z "$debian_chroot" ] && [ -r /etc/debian_chroot ]; then
    debian_chroot=$(cat /etc/debian_chroot)

# Color the prompt
export PS1="\[$(tput setaf 2)\]\u@\h:\[$(tput setaf 5)\]\W\[$(tput setaf 2)\] $\[$(tput sgr0)\] "

# enable color support of ls and also add handy aliases
if [ -x /usr/bin/dircolors ]; then
    test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
    alias ls='ls --color=auto'
    #alias dir='dir --color=auto'
    #alias vdir='vdir --color=auto'
    alias grep='grep --color=auto'
    alias fgrep='fgrep --color=auto'
    alias egrep='egrep --color=auto'

# Add an "alert" alias for long running commands.  Use like so:
#   sleep 10; alert
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'

# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases

# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
    . /etc/bash_completion

1 Answer 1


Found it. It's the line:

shopt -s dotglob nullglob

Specifically, it was nullglob that caused the problem. Running shopt -u nullglob fixes it.

I thought that was only supposed to add dotfiles as candidates for glob expansion? Well, I guess that's sort of a separate question, so we'll call this question answered.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.