2. コマンドライン編集 |
Access Count :
( since Aug 1, 2000 )
コマンドラインでの入力で間違いを犯す可能性は誰にでもある. その際,いかに迅速に間違いを修正するかで作業効率が大きく変わる. bash ではコマンドラインでの編集に エディタと同様のインタフェースを用意している. デフォルトでは emacs と同じキーバインドを備えた emacs モードで機能している. |
||
<-- 「1.bash の基礎」へ戻る | ↑ 目次へ戻る | 「3.環境のカスタマイズ」へ進む --> |
2.1 emacsモード2.2 viモード
2.3 ヒストリ展開
2.4 Readline
2.1 emacs モードemacs ( mule ) についての詳しい解説はここでは割愛し, ここでは emacs モードでのコマンドリファレンスのみを示す.
- 基本コマンド
基本コマンド コマンド 説明 CTRL-b もしくは ← 後方(左方)に1文字分移動する CTRL-f もしくは → 前方(右方)に1文字分移動する CTRL-h もしくは DEL 後方(左方)に1文字削除する CTRL-d 前方(右方)に1文字削除する
- ワードコマンド
上記の基本コマンドは 1 文字単位の移動/削除であるが, ワード(単語)での移動/削除もできる.
ワードコマンド コマンド 説明 ESC b 後方(左方)に1ワード移動する ESC f 前方(右方)に1ワード移動する ESC DEL 後方(左方)に1ワード削除する ESC CTRL-h 後方(左方)に1ワード削除する ESC d 前方(右方)に1ワード削除する CTRL-y 最後に削除されたものを取り出す
- ラインコマンド
ラインコマンド コマンド 説明 CTRL-a 行の先頭に移動する CTRL-e 行の最後に移動する CTRL-k 行の最後まで削除する
- ヒストリファイル内の移動
bash ではデフォルトでヒストリリストを ~/.bash_history に保存しており,起動するたびにその内容をメモリに取り込む. そして,シェルから抜けるときに,そのヒストリリストを ~/.bash_history に保存する.
ヒストリ機能を利用することは, このヒストリリストにアクセスしてコマンドリストから過去の入力を抽出したり編集したりすることになる.
直観的には常にヒストリリストを emacs で編集していて,コマンドラインはその最終行であり, この emacs は 1 行のみの表示であると考えればよい. それゆえ,↑キーを押すことは, そのファイルでの上の行を表示することになり, 過去のコマンドが表示される.
ヒストリファイル内を移動するためのコマンド コマンド 説明 CTRL-p または ↑ 前の行(前のコマンド)へ移動する CTRL-n または ↓ 次の行(次のコマンド)へ移動する CTRL-r 後方検索を実行する ESC < ヒストリの先頭に移動する ESC > ヒストリの最後に移動する このうち CTRL-r の後方検索はあまり馴染みがないかもしれないが, 指定したパターンをヒストリから検索してくれるもので, 希望のコマンドが出てくるまで CTRL-r を押し続けるか, より詳しくパターンを指定することで効率良くヒストリ機能を利用できる. (emacs を利用している人はどちらかというと前方検索 CTRL-s の方が馴染みがあるかもしれないが基本は同じである.)
- テキスト補完
ヒストリ機能は過去の入力の再利用によって作業効率を高めるのであった. しかしながら, これから新しく入力しようとしているコマンドに対しては役に立たない. そのためのサポートとしてあるのがこのテキスト補完である. 例えば,カレントディレクトリに
this_is_an_example_of_long_file_name.cという長い名前の C プログラムがあったとしよう. これをコンパイルするのに% cc this_is_an_example_of_long_file_name.cと入力するのは面倒だし,間違いも犯しやすい. こういった場合,ファイル名を途中まで入力して TAB キーを押してみる. すると,可能な限りそのファイル名の残りを自動的に埋めてくれる.
例えば,this_is_an_example_of_long_file_name.h というヘッダファイルもカレントディレクトリにある場合,% cc this[TAB]と.c の前まで補完してくれる. 補完コマンドの一覧を以下に示す.
↓
% cc this_is_an_example_of_long_file_name.
補完コマンド コマンド 説明 TAB テキストの標準的な補完を試みる ESC ? または TAB TAB 補完候補の一覧を表示する CTRL-x / ファイル名補完候補の一覧を表示する CTRL-x ~ ユーザー名補完候補の一覧を表示する CTRL-x @ ホスト名補完候補の一覧を表示する CTRL-x ! コマンド補完候補の一覧を表示する 実際,ほとんどは TAB キーを 1 回もしくは 2 回押すだけで事足りるであろう.
- その他のコマンド
コマンド 説明 CTRL-j RETURN と同じ CTRL-l 画面を消去し,現在のコマンドラインを画面の先頭に配置する CTRL-m RETURN と同じ CTRL-o RETURN と同じだが,コマンドヒストリの次のコマンドラインを表示する CTRL-t カーソル位置とその左にある 2 つの文字を交換する CTRL-u コマンドラインの先頭からカーソルの前までを削除する CTRL-v 特殊文字 (CTRL-d 等)をそのまま文字列として出力させる CTRL-[ ESC と同じ ESC c カーソルの右に位置するワードの頭文字を大文字にする ESC u カーソルの右に位置するワードをすべて大文字にする ESC l カーソルの右に位置するワードをすべて小文字にする ESC . または ESC _ 前のコマンドラインの最後のワードをカーソルの右に挿入する 通常利用しているエディタが vi である人も珍しくない. そういった人達にとってはシェル上のコマンドライン編集にも vi ライクなものを求めるかもしれない.
2.3 ヒストリ展開以下では詳しい解説は割愛し,コマンドの列挙にとどめる. 詳しくはトップページで紹介した文献等を参考にしてもらいたい.
vi モードを起動する方法については Readline の起動ファイル を見てもらいたい.
なお,現在起動中の bash でのみ使用したい場合は% set -o viとすればよい.vi エディタには入力モードと制御モードの 2 つのモードが備わっている. vi が起動したときは制御モードになっていて i とタイプすることで入力モードに移行するといったことは vi ユーザにとって周知の事実であろう. bash ではその逆で,入力モードからスタートする. その際の基本的なコマンドを次に示す.
コマンド 説明 DEL カーソルの左にある文字を削除する CTRL-w カーソルの左にある文字列をスペースまで削除する CTRL-v 特殊文字 (CTRL-d 等)をそのまま文字列として出力させる ESC 制御モードに移る
- 制御モードのコマンド
vi エディタの編集コマンドは以下に示すようにひととおり装備されている.
vi 制御モードの基本コマンド コマンド 説明 h または ← 左に 1 文字移動する l または → 右に 1 文字移動する w 右に 1 ワード移動する b 左に 1 ワード移動する W 次のノンブランクワードの先頭に移動する B 前のノンブランクワードの先頭に移動する e 現在のワードの終りに移動する E 現在のノンブランクワードの終りに移動する 0 コマンドラインの先頭に移動する ^ コマンドラインで最後のスペース以外の文字に移動する $ コマンドラインの終りに移動する ※ワード = アルファベット,数字,アンダースコアだけで構成された文字列 または アルファベットと数字以外で構成された文字列
※ノンブランクワード=スペースの空いていない文字列
- テキストの入力と変更
制御モードから入力モードに移行するコマンドは次のものが用意されている.
コマンド 説明 i 現在の文字の前にテキストを挿入する a 現在の文字の後ろにテキストを挿入する l コマンドラインの先頭にテキストを挿入する A コマンドラインの終りにテキストを挿入する R 既存のテキストに上書きする
- 削除コマンド
コマンド 説明 D コマンドラインの終りまで削除する dd コマンドライン全体を削除する C コマンドラインの終りまで削除し,入力モードに移る cc コマンド来全体を削除し,入力モードに移る X 左の1文字を削除する x カーソル上の1文字を削除する これら以外にも多くのコマンドが存在するが, 通常利用するには十分であろう.
- ヒストリファイル内の移動
ヒストリファイルの概念については emacs モードでの ヒストリファイル内の移動 を参考にしてもらい,ここではそのコマンド一覧のみを示す.
コマンド 説明 k または - または ↑ 一つ前のコマンド(1 行だけ上)に移動する j または + または ↓ 一つ後ろのコマンド(1 行だけ下)に移動する G 与えられた回数分行を移動する /string ヒストリをさかのぼって string を検索する ?string ヒストリを下って string を検索する n 前回と同じ方向に検索を繰り返す N 前回とは反対の方向に検索を繰り返す
- テキスト補完
いったん入力モードから制御モードへ移行しないと使えないため, emacs モードでのテキスト補完に比べて若干面倒である.
コマンド 説明 \ テキストの標準的な補完を試みる = 補完候補の一覧を表示する bash には多彩なヒストリ展開機能が用意されているが, ここでは詳細については省略し,基本的なものを列挙するにとどめる.2.4 Readline
コマンド 説明 !! 最後のコマンドを実行する !n コマンドライン n を実行する !-n 現在のコマンドラインから n を引いたコマンドラインを実行する !string string ではじまる最後のコマンドを実行する !?string? string を含む最後のコマンドを実行する.最後の ? は任意である. ^string1^string2 string1 を string2 に置換したうえで最後のコマンドを繰り返す Readline とはテキストベースのインタフェースが必要なアプリケーションに利用されることを目的に,GNU プロジェクト用に開発されたソフトウェアライブラリである. これが bash のコマンドライン編集インタフェースになっている.つまり,bash ユーザは無意識のうちに Readline のお世話になっているのである.
- Readline の起動ファイル
デフォルトでは .inputrc というファイルが起動ファイルになっている. Readline に独自の定義を施したい場合は,自分のホームディレクトリに .inputrc というファイルを用意する.
例えば,bash を常に vi モードで起動したい場合は,この .inputrc にset editing-mode viという一行を書く.
この editing-mode というのは Readline に備えられている独自の変数であり, これを含めて以下に示すものが用意されている.なお,これらはすべてset 変数名 値という形式で .inputrc に書けばよい.
変数 説明 editing-mode 変数モードを vi モードまたは emacs モードに設定する horizontal-scroll-mode on に設定されていると, 画面の右端より後ろに入力が行われたときにコマンドラインが横に スクロールされる. デフォルトは offであり, コマンドラインは次の行にまたがって継続される. mark-modified-lines on に設定されていると, 変更が加えられたヒストリ行の先頭にアスタリスクが表示される. デフォルトは offである. bell-style none に設定されていると,Readline はまったく警告音を鳴らさない. visible に設定されている場合は, ビジブル警告(画面を反転させるなど)を使用する. audible に設定されている場合は,警告音を鳴らす. デフォルトは audible である. comment-begin vi にコメントが要求された場合に挿入される文字列である. デフォルトは # meta-flag on に設定されていると,8 ビットでの入力を受け付ける. デフォルトの値は offである. convert-meta on に設定されていると,8 番目のビットが設定されている文字に対し, 8 番目のビットを取り去ってエスケープ記号をつけ,ASCII キー配列に変換する. デフォルトの値は on である. output-meta on に設定されている場合,文字の 8 番目のビットを設定したまま直接表示する. デフォルトの値は offである. completion-query-items ユーザーがさらに補完候補を参照したいと要求した際に, 補完候補数が与えられた数より大きいかどうかを判定する. デフォルトの値は 100 である. keymap Readline の現在のキー配置を設定する. 指定可能な名前は emacs, emacs-standard, emacs-meta, emacs-ctlx, vi, vi-move, vi-command, vi-insert である.デフォルトの値は emacs .変数 editing-mode の値もキー配置に影響を与えることに注意. show-all-if-ambiguous on に設定されている場合, 警告音を鳴らす代わりに補完候補の一覧を表示する. デフォルトの値は off である. expand-tilde on に設定されている場合,Readline がワードを補完する際チルダ展開が試される. デフォルトの値は offである.
- キーバインド
例えば,デフォルト(emacs モード)の環境下では CTRL-e を押すことでコマンドラインの最後にカーソルが移動するようになっている. 同じ機能を CTRL-t でも実現することを考えてみよう.
Control-t: end-of-line もしくは "\C-t": end-of-lineを .inputrc に書くだけでよい.] 同様に,CTRL-t を押すことで rm -f core を実行したい場合,Control-l: "rm -f core" もしくは "\C-t": "rm -f core"と書く.
上のように end-of-line といった予約された機能に関しては Readline のオンラインマニュアル(man readline) を参考にしてもらいたい.
なお,コントロールキーではなくメタキー(ESC キー) に割り当てる場合は\M- を用いる.現在割り当ててあるキーバンドは
% bind -vとすることで確認できる.