IT・技術研修ならCTC教育サービス

サイト内検索 企業情報 サイトマップ

研修コース検索

コラム

WSLで始めるUbuntu

CTC 教育サービス

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes 

第19回 履歴機能について知ろう(1) (宮崎悟) 2020年5月

前回までは、キーバインドで指定されるコマンドについて説明しました。今回は、履歴もしくはヒストリーと呼ばれる機能について説明します。以降は履歴と呼びますが、履歴とヒストリー機能は同一のものです。

履歴機能

履歴機能は、今まで入力実行したコマンドの履歴を覚える機能です。コマンドの変数などを展開してから格納します。履歴は、シェル変数 HISTSIZE に設定した数値分、履歴を保存します。

bash起動時に、シェル変数 HISTFILE (デフォルト値は、~/.bash_history) のファイル内容を読み込んで、履歴情報を初期化します。bash 終了時には、シェル変数HISTFILESIZEで指定した数値の最新の履歴を、シェル変数 HISTFILE で指定したファイルに書き込みます。

今までの履歴を見るには、history コマンドを使用します。

$ history
1    apt search ltrace
2    apt search strace
3    apt search netcat
4    apt search openssl
5    sudo apt update && sudo apt upgrade -y
  (以下略)

左端の数字が履歴番号、その右側が実行したコマンドになります。

シェル変数 HISTTIMEFORMATに日時書式を設定すると、その日時形式の文字列がコマンド実行時の履歴として保管されます。以下、HISTTIMEFORMATを設定したときのhistory 実行例になります。HISTTIMEFORMATの末尾に空白を入れないと、日付文字列とコマンド文字列が連結されて表示されるので注意してください。

$ HISTTIMEFORMAT='%Y-%m-%d %H:%M:%S '
$ history
 1     2019-05-10 12:56:44 apt search ltrace
 2     2019-05-10 12:56:48 apt search strace
 3     2019-05-10 12:56:53 apt search netcat
 4     2019-05-10 12:56:57 apt search openssl
 5     2019-05-10 12:57:11 sudo apt update && sudo apt upgrade -y
    (中略)
 2029  2020-05-09 11:55:09 HISTTIMEFORMAT='%Y-%m-%d %H:%M:%S '
 2030  2020-05-09 11:55:10 history
履歴の展開

キーバインドで紹介した\C-p や\C-n のように、履歴を操作する方法もあります。履歴の操作には、bash が csh から取り込んだ機能である、履歴の展開機能もあります。今回は履歴の展開機能について説明します。

履歴の展開は、イベント指示子「!」から始まる文字列で操作を指定します。

指示子 説明
!n 履歴番号がn の履歴を表示・実行します
!-n 履歴番号がn個前の履歴を表示・実行します
!! 1つ前の履歴を表示・実行します
!string 履歴上、最近のstringで始まるコマンドを表示・実行します
!?string[?] 履歴上、最近のstringを含むコマンドを表示・実行します<br />stringの直後が改行であれば、末尾の?を省略できます。
!# これまでに打ち込んだコマンドライン全体

以下、イベント指示子の実行例です。

$ history | tail -10
 2081  ls
 2082  ls *
 2083  echo *
 2084  ls aaa
 2085  ls aaa bbb
 2086  ls aaa bbb ccc
 2087  ls aaa bbb ccc ddd
 2088  ls aaa bbb ccc ddd eee
 2089  ls aaa bbb ccc ddd eee fff
 2090  history | tail -10
# 履歴番号 2082 のコマンドを実行
$ !2082
ls *
aaa  bbb  ccc  ddd  eee  fff
# 3つ前のコマンドを表示
$ echo !-3
echo ls aaa bbb ccc ddd eee fff
ls aaa bbb ccc ddd eee fff
# 直前のコマンドを実行
$ !!
echo ls aaa bbb ccc ddd eee fff
ls aaa bbb ccc ddd eee fff
# 最近の ls で始まるコマンドを実行
$ !ls
ls *
aaa  bbb  ccc  ddd  eee  fff
# 最近の ec で始まるコマンドを実行
$ !?ec?
echo ls aaa bbb ccc ddd eee fff
ls aaa bbb ccc ddd eee fff
# これまでに打ち込んだコマンドライン全体を表示
$ echo ls aaa bbb ccc ddd eee fff !#
echo ls aaa bbb ccc ddd eee fff echo ls aaa bbb ccc ddd eee fff
ls aaa bbb ccc ddd eee fff echo ls aaa bbb ccc ddd eee fff

このように、「!」を使用することで、過去の履歴を使用できます。

fc コマンド

履歴展開のように過去のデータを実行する方法には、シェルの組み込みコマンドである fc (フィクスコマンド= fix command)を使う方法があります。fcは、履歴データを読み込んでエディタで編集し、編集後のデータを実行します。fc を引数無しで実行すると、直前の履歴を読み込んで編集できます。このとき起動するエディタは、変数FCEDITもしくはEDITORで設定したコマンドが使用されます。エディタでの編集を終了すると、編集したデータを表示・実行します。

fc の引数に履歴番号を指定すると、その履歴行がエディタに読み込まれます。引数に履歴番号の最初と最後の番号を指定すると、その範囲の履歴がエディタに読み込まれます。履歴番号に-m -nの数値を与えると、現在より-m前から-n前の履歴がエディタに読み込まれます。読み込んだ履歴をエディタに読み込むことにより、複数のコマンドの実行が可能になります。

$ history | tail -10
 2081  ls
 2082  ls *
 2083  echo *
 2084  ls aaa
 2085  ls aaa bbb
 2086  ls aaa bbb ccc
 2087  ls aaa bbb ccc ddd
 2088  ls aaa bbb ccc ddd eee
 2089  ls aaa bbb ccc ddd eee fff
 2090  history | tail -10
# 引数無しで実行、そのまま終了
$ fc
history | tail -10
 2082  ls *
 2083  echo *
 2084  ls aaa
 2085  ls aaa bbb
 2086  ls aaa bbb ccc
 2087  ls aaa bbb ccc ddd
 2088  ls aaa bbb ccc ddd eee
 2089  ls aaa bbb ccc ddd eee fff
 2090  history | tail -10
 2091  history | tail -10
# ↑履歴にfcコマンドの実行は残らない
# 引数に履歴記番号の範囲を指定
$ fc 2082 2089
# 以下の内容が読み込まれ、それを実行するとそのまま実行される。
ls *
echo *
ls aaa
ls aaa bbb
ls aaa bbb ccc
ls aaa bbb ccc ddd
ls aaa bbb ccc ddd eee
ls aaa bbb ccc ddd eee fff
# 引数に履歴暗号の相対範囲を指定
$ history | tail -9
 2107  ls *
 2108  echo *
 2109  ls aaa
 2110  ls aaa bbb
 2111  ls aaa bbb ccc
 2112  ls aaa bbb ccc ddd
 2113  ls aaa bbb ccc ddd eee
 2114  ls aaa bbb ccc ddd eee fff
 2115  history | tail -10
$ fc -9 -2
# エディタに以下の内容が読み込まれる。
ls *
echo *
ls aaa
ls aaa bbb
ls aaa bbb ccc
ls aaa bbb ccc ddd
ls aaa bbb ccc ddd eee
ls aaa bbb ccc ddd eee fff
終わりに

今回は、履歴機能と履歴の展開について説明しました。次回は、履歴の展開の応用編について説明します。次回をお楽しみに。

 


 

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes