Bashのコマンド編集機能と履歴管理:Windows→Linuxクロスレファレンス(1/2 ページ)
Linuxを利用するならCUIやコマンドラインの使いこなしは必須。長いコマンド名やパラメーターの入力にくじけないよう、Bashのコマンドライン編集/履歴管理を紹介する。
bashのコマンドライン編集機能
前回はLinux初心者向けにWindowsのdirコマンドに相当するlsコマンドを解説した。今回からしばらくは、bash(解説)を使いながら、Linuxに慣れていこう。
bash(Linux)を使って作業をする場合、ほとんどの操作はコマンドライン上で、コマンド名や引数などを全て手動で入力して実行する必要がある。
だが長いコマンド名やパラメーターを間違いなく入力するのは、慣れていないと簡単ではない。それでも、同じコマンドをそのまま再実行したり、コマンドや引数などを少し変えてもう一度実行したりするというのも、CUIではよくある作業だ。
ユーザーの環境にもよるが、ほとんどのbash環境ではキーボードにある矢印キーなどを使ってコマンド履歴を呼び出して編集し、簡単に再実行できるようになっている(エスケープシーケンスをサポートしていないような端末経由で利用している場合を除く)。Windowsのコマンドプロンプトでも、矢印キーでコマンド履歴を呼び出して再編集できるが、bashの編集機能はもう少し豊富で便利なので、ぜひ覚えておこう。
●bashの編集モードについて
bashでコマンドラインや履歴などを編集する場合、幾つか方法がある。
- キーボードの矢印キーや[Delete]キーなどだけで編集・操作する
- emacsスタイルのキー操作で編集・操作する(「emacs」は著名なテキストエディタの1つ)
- viスタイルのキー操作で編集・操作する(「vi」も古くからあるテキストエディタの1つ)
- history機能を使って編集・操作する
以下、順に見ていこう
キーボードでコマンドラインを編集する
bashではユーザーが入力したコマンド列を常に何件が保存しており(システムにもよるが、デフォルトでは最大1000行分)、要求に応じて呼び出して再実行したり、再編集したりできるようになっている。このコマンド履歴はWindowsのコマンドプロンプトと違って、セッションをログアウトしても次回の再ログイン時にはまた使えるようになっている。現在の履歴の一覧はhistoryコマンドで確認できる(詳細は後述)。
過去のコマンドの履歴を呼び出す一番簡単な方法は、[↑]や[↓]キーでコマンド履歴列を順番に表示させることである。ただし(Windowsのコマンドプロンプトの[F7]キーのような)一覧を表示させるキー割り当てはないので、履歴の全体を確認したければ、historyコマンドを実行すること。
目的のコマンドが表示されたら、そのまま[Enter]キーを押せば再実行できる。
カーソル移動によるコマンドラインの編集
コマンドを間違えた場合は、矢印キーで過去のコマンドラインを呼び出して修正後、[Enter]キーを押すと再実行できる。これはWindows 10のBash on Windowsでの実行例。
(1)コマンドの入力例。
(2)コマンド名を間違えている。
(3)[↑]キーで呼び出し、[←][→]キーでカーソルを移動後、[Delete]で削除したり、打ち直したりして再実行できる。
内容を編集したい場合は、[←]や[→]キーなどでカーソルを移動し、新しい文字を入力したり、[Back Space]や[Delete]キーで削除したりするなどしてから、最後に[Enter]キーを押す。編集に利用できるキーの一覧を次に示しておく。
キー | 機能 |
---|---|
[↑] | 履歴を1つ前へ戻る |
[↓] | 履歴を1つ後ろへ進める |
[←] | カーソルを1文字分左へ移動する |
[→] | カーソルを1文字分右へ移動する |
[Home] | カーソルを行頭へ移動する |
[End] | カーソルを行末へ移動する |
[Delete] | カーソルの位置の文字を1文字削除する |
[Ctrl]+[W] | カーソルの直前の1語を削除する |
[Ctrl]+[U] | 現在の行内容をすべて削除して空にする(kill) |
[Ctrl]+[V]<文字> | 制御文字など、特殊な文字を入力する |
[Enter] | コマンドテキストの送信と実行 |
キーボードで操作可能な基本的編集・履歴機能 後述のemacs/viスタイルに含まれない、基本的なキー割り当てのみをまとめておく(システムによってはカーソル移動キーが使えないこともある)。 |
emacsモードのキー操作でコマンドラインを編集する
以上のキー割り当て以外にも、bashには「emacsスタイル」もしくは「viスタイル」という編集キー割り当てがあり、より高度な編集機能が利用できる。「emacs(イーマックス)」や「vi(ヴィ・アイ)」はUNIX/Linux環境でよく使われるテキストエディタの2大流派であり、これらのキー割り当てを再現したのがこの編集モードである(*1)。
*1 正確には、これはbash独自の機能ではなく、bashが利用しているreadlineライブラリが持つ機能である。readlineを使っている他のプログラムでも、この入力時の編集補助機能がサポートされていることものがある。
bashはデフォルトではemacsスタイルに設定されているため、通常はこのキー割り当てを覚えておくとよいだろう。現在のスタイルがどちらか確認したり、スタイルを変更したりするには「set -o」コマンドを利用する。
コマンドライン編集スタイルの確認
bashのデフォルトはemacsスタイルになっている
(1)編集スタイルを確認するにはset -oを実行する。
(2)emacsスタイルがオンになっている(viスタイルはoff)。
emacsは、コマンドとして[Shift]や[Ctrl]の他に[Meta]キーも多用するエディタである。だが、一般のPCには[Meta]キーはないので(これは当初emacsが開発されたLispマシンにあった特徴的なキー)、以下では[Alt]か[Esc]キーとして表記している。以下にemacsスタイルにおける主なキー割り当てをまとめておく。
キー | 機能 |
---|---|
[Ctrl]+[P] | 履歴を1つ前へ戻る(Previous) |
[Ctrl]+[N] | 履歴を1つ後ろへ進める(Next) |
[Ctrl]+[B] | カーソルを1文字分左へ移動する(Back) |
[Ctrl]+[F] | カーソルを1文字分右へ移動する(Forward) |
[Ctrl]+[A] | カーソルを行頭へ移動する(Beginning of line) |
[Ctrl]+[E] | カーソルを行末へ移動する(End of line) |
[Back Space] | カーソルの前の文字を1文字削除する |
[Ctrl]+[←] | カーソルを1つ前の単語へ移動する |
[Ctrl]+[→] | カーソルを1つ後の単語へ移動する |
[Esc][B]もしくは [Alt]+[B] |
カーソルを1つ前の単語へ移動する |
[Esc][F]もしくは [Alt]+[F] |
カーソルを1つ後の単語へ移動する |
[Ctrl]+[D] | カーソルの位置の文字を1文字削除する(Delete) |
[Ctrl]+[K] | カーソルの位置から行末までを削除する(Kill) |
[Esc][D]もしくは [Alt]+[D] |
カーソル位置の単語を削除する |
[Esc][Back Space]もしくは [Alt]+[Back Space] |
カーソルの1つ前の単語を削除する |
[Ctrl]+[Y] | 削除した文字列をカーソル位置に貼り付ける |
[Ctrl]+[r]文字列 | [Ctrl]+[r]を押した後、文字列を入力すると、それを含む履歴が表示される |
[Ctrl]+[X][Ctrl]+[U] | アンドゥ |
[Ctrl]+[T] | カーソルの前後の文字を入れ替える(Transpose) |
[Esc][T]もしくは [Alt]+[T] |
カーソルの前後の単語を入れ替える |
[Esc]<数字> もしくは [Alt]+<数字> |
後続のコマンドや入力文字などを指定した回数繰り返す。例:[Esc][8][0][A]と入力すると文字Aが80文字入力される |
emacsスタイルの場合に利用可能なキー割り当て(主要なもののみ) bashをemacsスタイルに設定している場合に利用できる基本的なキー割り当て(もちろんカスタマイズ可能)。本来emacsは[Meta]という特殊キーを使うが、一般のPCやターミナルエミュレーターの場合は[Esc]キーを押してから次のキーを押すか、[Alt]とともに押すこと。 |
コマンドラインの編集機能は、デフォルトのキー割り当てが/etc/inputrcファイルなどで定義されている。これをユーザーが独自にカスタマイズして自分だけの設定にすることも可能である。現在のキー割り当てはbindコマンドで確認できる。
user01@DESKTOP-5TV2I57:~$ bind -p ……キー割り当ての確認
"\C-g": abort
"\C-x\C-g": abort
"\e\C-g": abort
"\C-j": accept-line
"\C-m": accept-line
# alias-expand-line (not bound)
# arrow-key-prefix (not bound)
# backward-byte (not bound)
"\C-b": backward-char
"\eOD": backward-char
"\e[D": backward-char
"\C-h": backward-delete-char
"\C-?": backward-delete-char
"\C-x\C-?": backward-kill-line
"\e\C-h": backward-kill-word
"\e\C-?": backward-kill-word
"\e\e[D": backward-word
"\e[1;5D": backward-word
"\e[5D": backward-word
"\eb": backward-word
"\e<": beginning-of-history
"\C-a": beginning-of-line
"\eOH": beginning-of-line
"\e[1~": beginning-of-line
"\e[H": beginning-of-line
"\C-xe": call-last-kbd-macro
……(以下省略)……
Copyright© Digital Advantage Corp. All Rights Reserved.