Qualquer shell linux possui um habilidade bastante útil que é completar os comandos quando apertamos em <TAB>, então o restante do comando pode ser completado com um comando que esteja no path ou com um arquivo que esteja na pasta atual.
No caso do ubuntu, alem de comandos e arquivos, ele também completa com interfaces de rede, subcomandos alem de para alguns comandos, só completar com arquivos que sejam relevantes pro comando. Exemplo:
$ unzip <Tab> (Só completará com arquivos que tenham a extensão .zip)
Alguns comandos, embora conveniente, não possuem essa qualidade, um exemplo é o g++. No meu caso, só queria que ele completasse com arquivos de extensão cpp ou c .
Pesquisando onde provavelmente implementaria essas funções(o arquivo ~/.bashrc) encontrei que para isso ele executa o script /etc/bash_completion . Minha solução para adicionar esse conveniência ao g++ foi adicionar a seguinte linha nesse script.
complete -f -X ‘!*.@(cpp|c)’ g++
Também poderia colocar esta linha no ~/.bashrc, mas colocando no /etc/bash_completion, todos os usuários herdaram essa função.
Quando você abrir o /etc/bash_completion você verá que comandos como unzip, xpdf, gunzip, entre outros também estarão lá. Assim você poderá alterar eles também, por isso, cuidado ao alterar esse arquivo(talvez por isso ele necesite de permissão de sudo)