1. 概要

Linuxターミナルで作業するときは、ほとんどの場合、Bashシェルを使用します。 さまざまなオプションを使用して、多くの一般的なコマンドを複数回入力します。 詳細なコマンドを入力しているときに、間違いがあることに気付くことがあります。 テキスト全体を再入力する代わりに、豊富な履歴機能を使用して修正および検索します。

このチュートリアルでは、Bash履歴を使用してより効率的に作業する方法を説明します。

2. 履歴を有効にするための基本構成

Bashシェルで履歴操作を許可するには、最初に履歴を有効にする必要があります。 また、コマンドラインからの入力を読み取るようにReadlineライブラリを構成する必要があります。 このセクションでは、履歴を有効にしてReadlineライブラリを構成する方法について説明します。

Bashシェルが起動すると、履歴が初期化され、Readlineライブラリ構成の.inputrcファイルが読み取られます。

2.1. Bash履歴の有効化

まず、履歴が有効になっているかどうかを確認しましょう。

$ set -o | grep history
history        	on

履歴がオフになっている場合は、.bashrcファイルで設定してオンにします。

$ set -o history

その後、 echo コマンドを使用して、ファイルの場所と履歴サイズが設定されているかどうかを確認しましょう。 HISTFILE 変数は、履歴ファイルの場所を格納します。

$ echo $HISTFILE

値が/dev / null の場合、いつものように、.bashrcファイルで設定する必要があります。

HISTFILE=$HOME/.bash_history

HISTSIZE変数とHISTFILESIZE変数を使用して、Bash履歴の長さを構成します。

$ echo $HISTSIZE
$ echo $HISTFILESIZE

HISTSIZEまたはHISTFILESIZEのいずれかの値がゼロの場合、.bashrcファイルでそれらを構成する必要があります。

HISTFILESIZE=500
HISTSIZE=500

2.2. Readlineライブラリの構成

次に、Readlineライブラリを構成します。 この目的のために、.inputrcファイルを操作する必要があります。 .inputrc ファイルには、キーバインディング、変数の割り当て、および条件付き構文が記述されています。 ホームディレクトリの.inputrc ファイルをカスタマイズすることで、Readlineライブラリのデフォルトの動作を上書きできます。

エディターをemacs(デフォルトモード)から vi に変更するには:

$ set editing-mode vi

表示されるベルを設定するには:

$ set bell-style visible

ケースを無視したい場合:

$ set completion-ignore-case On

変数を設定したら、traversalのキーの構成に移りましょう。

ANSIモードの場合、矢印キーを次のように設定します。

"\M-[D":        backward-char
"\M-[C":        forward-char
"\M-[A":        previous-history
"\M-[B":        next-history

bashrcファイルでbindコマンドを使用しても、同じ動作を得ることができます。

$ bind '"\e[A": history-search-backward'
$ bind '"\e[B": history-search-forward'

ここで、 \M-はメタキーです。 メタキーがない場合は、 \eであるエスケープキーを意味します。

3. Bash履歴の使用

シェルが構成されたので、履歴の使用を開始しましょう。 まず、既存の履歴ファイルを検索する方法を説明します。 次に、Bashが提供する組み込みコマンドの使用方法を学習します。 そして最後に、コマンドを変更して実行する方法を説明します。

3.1. 歴史を横断する

履歴をトラバースするには、矢印キーまたはControlキーを使用します。

  • ⬆️またはCTRL-p:後方にトラバースします
  • ⬇️またはCTRL-n:前方にトラバースします

3.2. 履歴内のコマンドの検索

インクリメンタルモードまたは非インクリメンタルモードのいずれかでコマンド履歴を検索できます。 インクリメンタルモードの場合、検索文字列の入力を開始するとすぐに検索が開始されます。

  • CTRL- r:逆方向に検索します
  • CTRL- s:順方向に検索

3.3. Bash組み込みコマンド

Bashシェルには、組み込みのfcおよび履歴コマンドが付属しています。

主に履歴リストの一部を一覧表示、編集、再実行するためにfcコマンドを使用し、履歴リストを操作するためにhistoryコマンドを使用します

まず、fcコマンドを見てみましょう。

ターミナルで使用されるコマンドを一覧表示するには:

$ fc -l
39	 vi file1
40	 ls -la file3
41	 ls file3
42	 cd ..
43	 history
44	 ls -la file3
45	 ls
46	 cd -
47	 ls
48	 rm file*
49	 touch file1 file2 file3 file4
50	 ls file3
51	 history 

ご覧のとおり、履歴コマンドのリストを取得しました。

実行する前にコマンドを編集したい場合は、fcをさまざまなオプションとともに使用します。 以下のすべてのfcコマンドがエディターで開きます。 

最後のコマンドが次の場合:

$ cat incorrectfilename.demo

次に、コマンドを実行した後:

$ fc

エディターには、コマンドまたはテキストが含まれます。

$ cat incorrectfilename.demo

また、 n 番目の場所でコマンドを編集するには、以下のリストの最後から4番目と言います。

$ fc -4
   43  history
   44  ls -la file3
   45  ls
   46  cd -
   47  ls
   48  rm file*
   49  touch file1 file2 file3 file4
   50  ls file3
   51  history 
   52  tou
   53  fc -l
   54  ls file3

この場合、エディターには次のコマンドまたはテキストが含まれます。

$ history

範囲内のコマンドを編集するには、次を使用します。

$ fc 49 50

エディターが次の行で開きます。

$ touch file1 file2 file3 file4
$ ls file3

必要に応じて、エディターでコマンドを変更できます。 エディターを終了した後、変更されたコマンドが実行されます。

では、履歴コマンドを見てみましょう。

このコマンドは、履歴ファイルから実行されたすべてのコマンドを行番号とともに一覧表示します。

$ history
   33  ls
   34  ls
   35  pwd
   36  pwd
   37  set -o history
   39  pwd

最後に実行されたnコマンドを確認したい場合は、次のようにします。

$ history 3
   38  set -o history
   39  pwd
   40  history 3

次を使用して最後のコマンドを実行できます。

  • ⬆️
  • !!
  • !-1
  • CTRL-P

履歴をクリアするには

$ history -c

予想どおり、ここで history コマンドを実行すると、リストされるコマンドは1つだけです。

$ history
   32  history

履歴から特定のコマンドを削除するには:

$ history -d 32

履歴ファイルからイベント番号32を削除します。

3.4. 単純な履歴拡張の使用

組み込みのコマンド以外に、履歴には豊富な機能があります。 拡張文字「!」を使用します履歴の行/コマンド。 ここでは、歴史から選ばれたコマンドをイベントと呼び、言葉は私たちが行動するイベントの一部です。 また、選択した単語を操作するための修飾子を適用します。

event を実行する場合は、履歴の34行目のコマンドを言います。

!34

特定の文字で始まるイベントを実行するには、pで始まる最後に使用したコマンドを言います。

!p
$ pwd

3.5. より高度な履歴コマンド

別のコマンドを実行したいが、同じ値またはパラメーターを使用したい場合があります。この目的のために単語指定子「!!:$」を使用します

以下に示すように、 cd コマンドは、最後のイベント’ lsDemo’から引数Demoを取ります。

$ ls Demo
file1		file2
$ cd !!:$
$ cd Demo

現在のコマンドに最後のイベントの引数を適用する場合は、拡張文字「!」を使用します。 その後に「^」、「$」、または「:n」が続きます。

ここで、 rm は、イベント touch の最初の引数を取り、file1を削除します。 ただし、 file4 を削除するには、文字’$’を使用します。 同様に、「:2 」を使用して、file2を削除します。

$ touch file1 file2 file3 file4
$ rm !^
$ rm file1

イベントを操作するもう1つの方法は、修飾子を使用することです。 ここで、「!to:3」は、テキスト「to」で始まる最後のイベントに展開されます。この場合は、touchコマンドです。 その後、イベントの3番目の引数をlsコマンドの引数として置き換えます。

touch file1 file2 file3 file4
$ ls !to:3
$ ls file3
file3

3.6. 履歴内の各コマンドの日付と時刻を表示する

デフォルトでは、ほとんどのLinuxディストリビューションは、各コマンドが実行された日時を表示しません。 HISTTIMEFORMAT 変数を一時的または永続的に設定することで、この動作を変更できます。

まず、一時的に設定する方法を見てみましょう。

$ export HISTTIMEFORMAT='%Y-%m-%d %H:%M:%S '

HISTTIMEFORMAT変数をエクスポートし、標準の日時形式に設定しています。

%Y-%m-%d は、年、月、日で始まる日付形式を表します。 %H:%M:%S 時間、分、秒を表します 。 この方法は、何を表示するかをより細かく制御できるため、非常に便利です。

次のコマンドを変更することで、この形式を簡略化できます。

$ export HISTTIMEFORMAT='%F %T '

ここで、 %F は標準の日付形式に拡張され、%Tは標準の時刻形式に拡張されます。

historyコマンドを実行してみましょう。

$ history
   33 2022-05-03 17:58:33 ls
   34 2022-05-04 12:04:44 ls
   35 2022-05-04 12:04:57 pwd
   36 2022-05-04 12:05:44 export HISTTIMEFORMAT='%F %T '
   37 2022-05-04 12:05:44 history

各コマンドの前に、実行された日時が表示されていることがわかります。

それでは、HISTTIMEFORMAT変数を永続的に設定する方法を見てみましょう。

まず、〜/.bashrcファイルを開く必要があります。

$ nano ~/.bashrc

次に、次の行を追加します。

export HISTTIMEFORMAT='%F %T '

最後に、 source コマンドを実行して、行った変更を更新する必要があります。

$ source ~/.bashrc

これで、 history コマンドを実行するたびに、各コマンドが実行された日時も取得されます。

4. 結論

この記事では、ReadlineライブラリとHistoryライブラリがBashの履歴拡張にどのように役立つかについて説明しました。 また、これらの拡張機能を使用すると、作業効率がどのように向上するかについても説明しました。 詳細については、いつでも次のリファレンスを参照できます。

  1. Readlineライブラリ
  2. 歴史の拡大
  3. サンプルinputrcファイル