IT技術で仕事を減らしたい!

ITエンジニアのメモ+α

bashの入力履歴について

どうも、nippa です。

コマンドラインでの入力履歴関連をまとめておこうと思います。

bash についてまとめておきます。

環境

MacOS 10.15

bash でのコマンドの入力履歴

bash でのコマンドの入力履歴関連の環境変数

bash での入力履歴の環境変数は以下の通りです。

  • HISTFILE: コマンド履歴を保存するファイル名
  • HISTSIZE: bash が保持するコマンド履歴の上限数(メモリ保存)
  • HISTFILESIZE: HISTFILE で指定したファイルに保存するコマンド履歴の上限数(ディスク保存)
  • HISTIGNORE: 保存しないコマンド
  • HISTCONTROL: ignoredups(重複コマンドを保存しない)、ignorespace(空白でコマンドを保存しない)、ignoreboth(重複コマンド、空白を保存しない)、erasedups(同一コマンドを無視)
  • HISTTIMEFORMAT: 実行日時の書式を指定 環境変数の確認
# コマンド履歴を保存するファイル名
echo $HISTFILE

# 出力:デフォルト
/User/[ユーザー名]/.bash_history


# bash が保持するコマンド履歴の上限数
echo $HISTSIZE

# 出力:デフォルト
500


# ファイルに保存するコマンド履歴の上限数
echo $HISTFILESIZE

# 出力:デフォルト
500


# 保存しないコマンド
echo $HISTIGNORE

# 出力:デフォルト(未設定)


# 入力履歴の設定
echo $HISTCONTROL

# 出力:デフォルト(未設定)


# 入力履歴の時間の書式
echo $HISTTIMEFORMAT

# 出力:デフォルト(未設定)

コマンド履歴関連の環境変数の変更

環境変数の変更はexportで定義します。

export HISTFILE=[ファイルパス]

export HISTSIZE=100000

export HISTFILESIZE=100000

export HISTIGNORE='source *:top'

export HISTCONTROL=ignoreboth

export HISTTIMEFORMAT='%F %T: '
# ファイル出力: 1000  2020-12-03 20:30:00: history

個人的には 10 万件の保存設定にしています。

あまり上限を上げすぎると、コマンドラインの動作が重くなるので注意が必要です。

コマンド履歴の検索

デフォルトではcontrol+rでリバース検索(reverse-i-search)が可能です。

また、リバース検索からフォワード検索する(i-search)を可能にするには、設定の変更が必要です。

フォワード検索はcontrol+sで可能ですが、デフォルトでは端末ロック(stop)が割り当てられています。

割り当てを解除するには、

# 割当の確認
stty -a

# 出力
speed 38400 baud; 30 rows; 80 columns;
lflags: icanon isig iexten echo echoe echok echoke -echonl echoctl
    -echoprt -altwerase -noflsh -tostop -flusho pendin -nokerninfo
    -extproc
iflags: -istrip icrnl -inlcr -igncr ixon -ixoff ixany imaxbel iutf8
    -ignbrk brkint -inpck -ignpar -parmrk
oflags: opost onlcr -oxtabs -onocr -onlret
cflags: cread cs8 -parenb -parodd hupcl -clocal -cstopb -crtscts -dsrflow
    -dtrflow -mdmbuf
cchars: discard = ^O; dsusp = ^Y; eof = ^D; eol = <undef>;
    eol2 = <undef>; erase = ^?; intr = ^C; kill = ^U; lnext = ^V;
    min = 1; quit = ^\; reprint = ^R; start = ^Q; status = ^T;
    stop = ^S; susp = ^Z; time = 0; werase = ^W;

# ストップとスタートの割当解除
stty stop undef
stty start undef

# 割当の再確認
stty -a

# 出力
speed 38400 baud; 30 rows; 80 columns;
lflags: icanon isig iexten echo echoe echok echoke -echonl echoctl
    -echoprt -altwerase -noflsh -tostop -flusho pendin -nokerninfo
    -extproc
iflags: -istrip icrnl -inlcr -igncr ixon -ixoff ixany imaxbel iutf8
    -ignbrk brkint -inpck -ignpar -parmrk
oflags: opost onlcr -oxtabs -onocr -onlret
cflags: cread cs8 -parenb -parodd hupcl -clocal -cstopb -crtscts -dsrflow
    -dtrflow -mdmbuf
cchars: discard = ^O; dsusp = ^Y; eof = ^D; eol = <undef>;
    eol2 = <undef>; erase = ^?; intr = ^C; kill = ^U; lnext = ^V;
    min = 1; quit = ^\; reprint = ^R; start = <undef>; status = ^T;
    stop = <undef>; susp = ^Z; time = 0; werase = ^W;

history コマンド

historyコマンドはメモリ保存されるコマンドの入力履歴に対して作用するコマンドになります。

また、入力履歴ファイルと入力履歴(メモリ保存)とやり取りを行うコマンドになります。

bashzsh ではコマンドのオプションが異なります。

bash: history コマンドのオプション一覧

オプション 内容
整数値 指定した行数から履歴を表示
-a 履歴ファイルに現在のセッションの履歴を追加
-c 入力履歴をすべて削除
-d 整数値 指定し整数値の入力履歴を削除
-n [ファイル名] 入力履歴ファイルから差分をすべて読み込む(ファイル指定がなければ、$HISTFILE で指定したファイル)
-r [ファイル名] 入力履歴ファイルを読み込み、入力履歴(メモリ保存)に追加(ファイル指定がなければ、$HISTFILE で指定したファイル)
-w [ファイル名] 入力履歴を入力履歴ファイルに上書き(ファイル指定がなければ、$HISTFILE で指定したファイル)

入力履歴ファイルの中のコマンドの実行

以下のコマンドを入力履歴ファイルに保存されたコマンドを直接実行することができます。

![historyの番号]

コピペはファイル内部の番号だけですみます。

感想

今回は bash の入力履歴についてまとめました。

フォワード検索とリバース検索を活用することで、コマンドの検索の時短と、入力ミスを減らすことができます。

また、! [historyの番号]は非常に便利な機能です。

どんどん活用して、時短していきましょう。

次回 zsh についてもまとめておきたいと思います。

ではでは、また次回。