MENU

タブキーでの入力補完が効かなくなったときの原因と直し方

少し前まで使えていたタブキーでの入力補完が、ある日突然効かなくなることがあります。パッケージの更新・設定ファイルの編集・ユーザーの追加など、シェル環境に変化が加わったタイミングで起きやすい問題です。ここでは原因の切り分け方と修正手順を整理します。

目次

まず使っているシェルを確認する

補完の仕組みはシェルによって異なります。最初に現在起動しているシェルを確認してから、該当する手順を進めてください。

echo $SHELL

出力が /bin/bash であれば bash、/bin/zsh または /usr/bin/zsh であれば zsh の手順を参照してください。/bin/sh と表示された場合は dash や POSIX sh が起動している可能性があります。その場合は bash または zsh と入力して切り替えてから作業してください。

bash の場合の切り分けと修正

bash-completion パッケージを確認する

bash の補完機能の多くは bash-completion パッケージが提供しています。このパッケージが入っていないと、コマンド名の一部は補完できても、オプションや引数への補完が効かない状態になります。

# Debian / Ubuntu
dpkg -l bash-completion

# RHEL / AlmaLinux / Rocky Linux
rpm -q bash-completion

インストールされていなければ次のコマンドで追加できます。

# Debian / Ubuntu
sudo apt install bash-completion

# RHEL 系
sudo dnf install bash-completion

設定ファイルが読み込まれているか確認する

パッケージが入っていても、シェルの設定ファイルで読み込まれていなければ機能しません。~/.bashrc や /etc/bash.bashrc に読み込み処理が存在するかを確認します。

grep -n 'bash.completion\|bash_completion' ~/.bashrc /etc/bash.bashrc 2>/dev/null

何も出力されない場合は、~/.bashrc に次の記述を追加してください。

if [ -f /usr/share/bash-completion/bash_completion ]; then
    . /usr/share/bash-completion/bash_completion
elif [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
fi

追加後は次のコマンドで設定を反映するか、端末を開き直してください。

source ~/.bashrc

readline のキーバインドを確認する

bash の補完は GNU Readline を通じて動作しています。~/.inputrc の誤った設定などにより、Tab キーが complete 以外のアクションに割り当てられると補完が機能しません。現在の割り当てを次のコマンドで確認できます。

bind -p | grep complete

正常な状態であれば "\t": complete という行が含まれます。self-insert など別のアクションが割り当てられている場合は、~/.inputrc の内容を確認してください。意図しない設定があれば削除するか、次の1行を ~/.inputrc に追加してデフォルトに戻します。

"\t": complete

posix モードが有効になっていないか確認する

set -o posix が有効になっている場合、bash の拡張補完機能が一部無効になります。次のコマンドで状態を確認できます。

set -o | grep posix

posix の列が on になっていた場合は、set +o posix で解除できます。ただし .bashrc や .bash_profile に記述されていれば、そちらも修正が必要です。

zsh の場合の切り分けと修正

compinit が呼ばれているか確認する

zsh の補完システムは compinit の呼び出しによって初期化されます。~/.zshrc にこの記述がなければ補完は一切動作しません。

grep -n 'compinit' ~/.zshrc

記述がない場合は次の2行を ~/.zshrc に追加してください。

autoload -Uz compinit
compinit

追加後は source ~/.zshrc を実行するか端末を再起動してください。

キャッシュファイルをリセットする

zsh は補完情報をキャッシュファイル(~/.zcompdump)に保存します。このファイルが壊れたり古くなったりすると、補完が不安定になる場合があります。次のコマンドでキャッシュを削除してシェルを再起動すると、ファイルが自動的に再生成されます。

rm -f ~/.zcompdump*
exec zsh

compaudit でパーミッションの問題を確認する

補完スクリプトを置くディレクトリにグループ書き込み権限や全員書き込み権限が設定されている場合、zsh はセキュリティ上の理由から補完の読み込みを停止します。次のコマンドで問題のあるパスを確認できます。

compaudit

ファイルやディレクトリのリストが出力された場合は、パーミッションを修正してください。想定例として /usr/local/share/zsh/site-functions が表示されたケースでは、次のように対処できます。

chmod 755 /usr/local/share/zsh/site-functions

それでも直らないときに確認すること

ここまでの手順で解決しない場合は、次のポイントを確認してください。

ログインシェルとインタラクティブシェルの違いを確認する
SSH 接続時と端末エミュレータ起動時では読み込む設定ファイルが異なります。bash なら .bash_profile(ログインシェル)と .bashrc(インタラクティブシェル)、zsh なら .zprofile と .zshrc の役割を把握し、補完の読み込み処理がどちらに書かれているかを確認してください。SSH で補完が効かない場合は .bash_profile 側に処理を追加するか、.bash_profile から .bashrc を呼び出す記述があるかを確認するのが典型的な対処です。

TERM 変数を確認する
端末タイプを表す TERM 変数が dumb になっていると、補完が意図的に無効化されるケースがあります。次のコマンドで確認できます。

echo $TERM

dumb と表示された場合は、ターミナルエミュレータの設定や SSH クライアントの SendEnv / AcceptEnv 設定を見直してください。

設定ファイルを読まずに起動して切り分ける
次のように設定ファイルを読み込まずに bash を起動し、その状態でタブを押しても補完が動かない場合は、パッケージやシェルバイナリ自体の問題が疑われます。逆にこの状態では動作するなら、設定ファイルのどこかに原因があります。

bash --norc --noprofile

設定ファイルなしの bash で補完が動く場合は、~/.bashrc を上から順に確認し、どの行を追加・変更したあとから補完が止まったかを特定していくと問題を絞り込めます。

「コマンドは打てる。次は”現場で通用する型”を最短で身につけたい」——そんなあなたへ。

ネットの断片的なTipsをコピペするだけでは、体系的な運用スキルはなかなか積み上がりません。リナックスマスター.JPの無料メルマガ「リナマガ」では、現場で実際に使うLinuxサーバー運用の考え方を、順を追って実務目線でお届けしています。いま登録された方には、安全なサーバー構築の「型」をまとめた『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼント中です。

>> 図解60P『Linux入門マニュアル』を無料で受け取る
(メルマガ登録は10秒・いつでも解除OK)

※ 「独学の時間がもったいない」「プロから現場の技術を最短で学びたい」という本気の方には、2日で実務レベルが身につく初心者向けハンズオンセミナーもご用意しています。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

目次