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

ITエンジニアのメモ+α

zshの入力履歴について

どうも、nippa です。

利用している Mac のデフォルトのシェルを zsh に乗り換えようと思っています。

zshbash では少し違いがあるので、その点についてもまとめていきたいと思います。

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

bashコマンドラインでの入力履歴については、こちらを参考にしてください。 timesaving.hatenablog.com

環境

MacOS 10.15

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

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

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

  • HISTFILE: コマンド履歴を保存するファイル名
  • HISTSIZE: zsh が保持するコマンド履歴の上限数(メモリ保存)
  • SAVEHIST: HISTFILE で指定したファイルに保存するコマンド履歴の上限数(ディスク保存)

環境変数の確認

# コマンド履歴を保存するファイル名
echo $HISTFILE

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


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

# 出力:デフォルト
2000


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

# 出力:デフォルト
1000

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

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

export HISTFILE=[ファイルパス]

export HISTSIZE=100000

export SAVEHIST=100000

コマンド履歴の検索

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

また、リバース検索からフォワード検索する(fwd-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 コマンド

zsh での historyfc -lエイリアスになっています。

man zshbuiltinsで、history を検索すると下記が記載されています。

history
    Same as fc -l.

ISO8601('yyyy-mm-dd hh:mm')の時間形式で入力履歴は以下のオプションで表示させることができます。

history -i
# 出力
...
1000  2020-12-04 20:30:00: history

時間形式を指定して、コマンドの入力履歴を表示させるには、以下のように指定してください。

# タブ区切りを利用する場合
HIST_FORMAT="'%Y-%m-%d %T' `$(echo -e '\t')`"
alias history="fc -t ${HIST_FORMAT} -il"

history
# 出力
...
1000  2020-12-03 20:30:00:  history

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

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

![historyの番号]

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

感想

bash から zsh に乗り換えようと考えています。

基本的には zsh では bash で設定したことがそのまま使えますが、細かい部分で違いがあるので、少しずつまとめながら乗り換えて行こうと思います。

ではでは、また次回。