CTC 教育サービス
[IT研修]注目キーワード Python UiPath(RPA) 最新技術動向 Microsoft Azure Docker Kubernetes
前回までは、キーバインドで指定されるコマンドについて説明しました。今回は、履歴もしくはヒストリーと呼ばれる機能について説明します。以降は履歴と呼びますが、履歴とヒストリー機能は同一のものです。
履歴機能は、今まで入力実行したコマンドの履歴を覚える機能です。コマンドの変数などを展開してから格納します。履歴は、シェル変数 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 (フィクスコマンド= 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