【 complete 】コマンド――補完の方法を指定する(bash)Linux基本コマンドTips(321)

本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、bashで補完を行う際の方法を指定する「complete」コマンドです。

» 2019年07月12日 05時00分 公開
[西村めぐみ@IT]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

「Linux基本コマンドTips」のインデックス

Linux基本コマンドTips一覧

 本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、bashで補完を行う際の方法を指定する「complete」コマンドです。

completeコマンドとは?

 「complete」はbashでコマンドラインの「補完」を行う方法を指定するコマンドです。bashの内部コマンド(ビルトインコマンド、シェルコマンド)であるため、「man」コマンドではなく、「help」コマンドや「man bash」で詳細を確認できます(man bash実行後に「/complete \[-ab+[Enter]キー」と入力)。

 bashでは、[TAB](または[CTRL]+[I])キーでコマンド名やファイル名の補完ができます。さらに各コマンドに対応する引数や対象ファイルなどを設定できる「プログラム補完」機能も利用できます(※1)。completeコマンドは、コマンドラインで入力している途中のコマンドに対し、どのような内容を補完するかという「補完仕様(compspec)」を定義するために使います。

※1 Programmable Completion(プログラム可能な補完)。本連載では日本語版の「man bash」に合わせて「プログラム補完」という訳語を使っています。



 一部のコマンドについては、/etc/bash_completion.d/以下にプログラム補完の定義ファイルが用意されており、ログインと同時に利用可能になっています。例えば、「git」コマンドであれば、「git[スペース]」に続いて[Tab]キーを2回押すと、gitコマンドで使用可能なサブコマンドを一覧表示します(補完のキー操作については「Linux再入門(5)」参照)。

 なお、「bash-completion」パッケージをインストールした環境の場合、主要コマンドのプログラム補完が使えるようになっているでしょう。bash-completionパッケージによる定義ファイルは、/usr/share/bash-completion/下に格納されています。



completeコマンドの書式

complete [オプション] [名前……]

complete [-Dまたは-E] [その他のオプション]

complete -pまたは-r [-Dまたは-E] [名前……]

※[ ]は省略可能な引数を示しています。





completeの主なオプション(表示と削除)

オプション 意味
-p 名前 指定した名前について補完仕様を表示する。名前を省略した場合は全て表示する(本文を参照、※2)
-r 名前 指定した名前について補完仕様を削除する。名前を省略した場合は全て削除する(本文を参照、※2)

※2 「-D」や「-E」オプションによる定義(どちらも名前を指定せずに使用するオプション、別表「completeの主なオプション(定義)を参照)を表示、削除したい場合は「complete -p -D」のように指定する。



completeの主なオプション(定義)

オプション 意味
-D 補完仕様が定義されていないコマンドに対する補完(デフォルトのコマンド補完)を設定する(※3)
-E 空文字に対する補完を設定する
-A アクション 補完候補リストをどのように作るかを「アクション」で指定する(別表「アクション」を参照
-G パターン パターンに従って展開した結果を補完候補リストにする(パス名展開と同じパターンを指定できる)
-W 単語リスト 指定した単語を補完候補リストにする(単語の区切りは変数IFSで定義、デフォルトの区切りは空白文字)
-F 関数 関数を実行して補完候補リストを生成する(※4)
-C コマンド 指定したコマンドの実行結果を補完候補にする(コマンドはサブシェル環境で実行される)
-P 文字列 接頭辞。それぞれの補完候補の先頭に指定した文字列を付け加える(他の全てのオプションによって補完候補が生成された後に実行される)
-S 文字列 接尾辞。それぞれの補完候補の末尾に指定した文字列を付け加える(他の全てのオプションによって補完候補が生成された後に実行される)
-X パターン パターンに従って展開した結果を補完候補から除外する(パス名展開と同じパターンを指定でき、他のオプションによって補完候補が生成された後に実行される)
-o オプション 補完オプションを指定する(別表「補完オプション」を参照

※3 「-D」はbashバージョン4.1以降で有効。
※4 関数で補完候補リストを生成する場合、生成したリストを配列変数「COMPREPLY」にセットすることで補完候補にできる。



アクション(-A)

アクション指定 短縮オプション 補完候補
-A file -f ファイル名(「-f」は「-A file」に相当、以下同じ)
-A directory -d ディレクトリ名
-A command -c コマンド名(エイリアスや内部コマンドも含む)
-A alias -a エイリアス名
-A builtin -b シェルの内部コマンド名
-A enabled 有効になっているシェルの内部コマンドの名前(enableコマンド:連載第224回
-A disabled 無効になっているシェル内部コマンドの名前
-A function シェル関数の名前
-A keyword -k シェルの予約語
-A variable -v シェル変数の名前
-A export -e 環境変数(エクスポートされたシェル変数)の名前
-A arrayvar 配列変数の名前
-A setopt -o 「set」コマンドの-oオプション(setコマンド:連載第205回)で使用できる引数
-A shopt 「shopt」コマンドに指定できるシェルオプション名
-A job -j ジョブ名
-A stopped 停止中のジョブ名
-A running 実行中のジョブ名
-A signal シグナル名
-A service -s サービス名
-A user -u ユーザー名
-A group -g グループ名
-A hostname ホスト名(/etc/hostsとシェル変数「HOSTFILE」で指定されたファイルから取得)
-A binding readlineキー割り当て名(「bind」コマンド:連載第206回
-A helptopic 「help」コマンドに指定できるトピック名

補完オプション(-o)

オプション 意味
-o default 補完仕様によって補完候補リストが生成できなかった場合、デフォルトの補完(ファイル名補完)を行う
-o bashdefault 補完仕様によって補完候補リストが生成できなかった場合、bashのデフォルトの補完を行う(※5)
-o dirnames 補完仕様によって補完候補リストが生成できなかった場合、ディレクトリ名の補完を試みる
-o plusdirs 補完仕様によって生成された補完候補リストに、ディレクトリ名の補完を追加する
-o filenames 補完仕様によってファイル名を生成することを想定する。ディレクトリ名にスラッシュを加えたり特殊文字をクオートで囲んだりするなど、ファイル名特有の処理を施す。シェル関数と共に使用する。
-o nospace 補完仕様によって生成された単語の後に空白を付け加えるデフォルト動作を抑制する

※5 「$」から始まる場合は変数で補完し、「~」から始まる場合はユーザー名で、「@」から始まる場合はホスト名で、それ以外の場合はコマンド名で補完する。いずれも補完できなかった場合はファイル名で補完する。





現在の補完の定義を表示する

 「complete -p 名前」で、名前に対する「補完仕様(compspec)」、つまり、どのような引数やオプションを補完するように定義しているか、を表示します。名前を省略した場合、全ての定義を表示します。

 例えば「complete -p groups」で、「groups」コマンド(※6)に対する補完仕様を確認できます。

※6 「groups ユーザー」で、ユーザーが所属するグループを表示する(連載第69回)。



 画面1は、bash-completionパッケージがインストールされている環境で実行しています(※7)。bash-completionパッケージによって、groupsコマンドに対して「complete -u」が定義されていることが分かります(※8)。「-u」はユーザー名を補完候補にする、というオプションです(「-A user」相当)。

※7 「/usr/share/bash-completion/bash_completion」ファイルで定義されている。
※8 bash-completionパッケージによる定義の場合、ユーザーが補完を試みることで、補完の定義ファイルを読み込むように設定されているコマンドもある。例えば「ping」コマンドの場合、ログイン直後に「complete -p ping」を実行した場合は定義がない(「補完指定がありません」というメッセージを出力)ものの、「ping[スペース]+[Tab]+[Tab]キー」で補完を試みた後に「complete -p ping」を実行すると補完定義を表示する。なお、このように動的に補完を変更する場合は「-D」オプションを用いる。



 なお、具体的にどのような内容が補完されるかは、「compgen」コマンド(第322回)で確認できます。例えば「complete -u」で補完される内容を表示するには、「compgen -u」とします。

コマンド実行例

complete -p 名前

(指定した名前に対する補完定義を表示する)

complete -p groups

(groupsコマンドに対する補完仕様を表示する)(画面1

complete -p

(現在定義されている全ての補完仕様を表示する)


 画面1では「groups」コマンドと「service」コマンドについて、どのような補完仕様が定義されているかを表示しています。serviceコマンドでは「_service」という関数が定義されていました。そこで、「declare」コマンド(連載第308回)の「-f」オプションで関数の内容を確認しています。関数「_service」の中で、補完候補のリストが配列変数「COMPREPLY」にセットされている様子が分かりました。

画面1 画面1 コマンドに対する補完内容を調べたところ


オリジナルの補完を定義する

 「complete オプション 名前」で、指定した名前に対してどのような引数やオプションを補完するかを設定します。

 例えば、「showtxt」というコマンドに対して、「拡張子が『.txt』のファイルだけを補完したい」のであれば画面2のコマンドライン(4番目)のように設定します。

 4番目のコマンドラインで、「-f」はファイル名を補完候補にするというcompleteコマンドのオプションです(「-A file」相当)。「-X」はパターンに従って展開した結果を補完候補から除外するというオプションです。ここでは「*.txt以外」という意図で、「'!*.txt'」と指定しました。

 この他、オプションやサブコマンドなど、任意の文字列を定義したい場合は「-W」オプションを使うとよいでしょう。

 completeの定義結果を確認したい場合は、画面2(3番目のコマンドライン)のように「compgen」コマンドを使います。

コマンド実行例

complete -f -X '!*.txt' showtxt

(showtxtコマンドに対しては拡張子が「.txt」のファイルだけを補完する)(画面2

compgen -f -X '!*.txt'

(「-f -X '!*.txt'」で補完される内容を確認する)(画面2


画面2 画面2 拡張子が「.txt」となっているファイルだけを補完の対象にしたところ

 なお、画面2では、「showtxt」という名前のエイリアスを定義して、completeコマンドでshowtxtに対する補完仕様を設定しています(※9)。

※9 「nl」はテキストファイルを行番号付きで表示するコマンド(連載第98回)。エイリアスについては連載第97回を参照。





補完仕様の定義を削除する

 「complete -r 名前」で、名前に対する補完仕様の定義を削除します。名前を指定しなかった場合、全ての補完仕様の定義を削除します(画面3)。

画面3 画面3 補完仕様の定義を削除したところ


筆者紹介

西村 めぐみ(にしむら めぐみ)

元々はDOSユーザーで「DOS版UNIX-like tools」を愛用。ソフトハウスに勤務し生産管理のパッケージソフトウェアの開発およびサポート業務を担当、その後ライターになる。著書に『図解でわかるLinux』『らぶらぶLinuxシリーズ』『Accessではじめるデータベース超入門[改訂2版]』『macOSコマンド入門』など。地方自治体の在宅就業支援事業にてMicrosoft Officeの教材作成およびeラーニング指導を担当。会社などの"PCヘルパー"やピンポイント研修なども行っている。


Copyright © ITmedia, Inc. All Rights Reserved.

スポンサーからのお知らせPR

注目のテーマ

Microsoft & Windows最前線2025
AI for エンジニアリング
ローコード/ノーコード セントラル by @IT - ITエンジニアがビジネスの中心で活躍する組織へ
Cloud Native Central by @IT - スケーラブルな能力を組織に
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。