ShellScript
Bash

自作シェルスクリプト実行時に、Tabキーで補完する拡張子を制限する

Tabキーでの補完

たとえば、ディレクトリ内のファイルが、

端末
$ls
a.aux a.dvi
a.log a.pdf
a.tex a.toc
compile_tex.sh

このような場合に、自作シェルスクリプトcompile_tex.shを実行することを考えます。
まず、./c[Space][Tab]と入力すると、

端末
$./compile_tex.sh

とうまく補完されて入力できます。

しかし、Texファイル「a.tex」を引数にするため、さらに[Space]a[Tab]]を入力すると、

端末
$./compile_tex.sh a.

と意図通りに補完できません。
これは、a.から始まるファイルが複数あるためです。

ある拡張子だけを補完したい!

では、自作シェルスクリプトcompile_texTabキーによる補完候補を拡張子.texのものだけにするにはどうしたらいいのでしょうか。

たとえば、~/.bashrcに次の関数、

.bashrc
_compile_tex(){
  local cur=${COMP_WORDS[COMP_CWORD]}
  COMPREPLY=( $(compgen -W "$(ls *.tex)" -- $cur) )
}
complete -F _compile_tex compile_tex.sh

を追加し、変更を反映させます。

端末
$bash

このようにすることで、./compile_tex a[Tab]を入力した時に

端末
$./compile_tex.sh a.tex

と、拡張子「.tex」のものだけを補完することができました。

また、上記の関数_compile_tex()において、*.texの部分を変えることで、好みの補完ができるようになります。