history コマンドに日時を付与する

## デフォルト
デフォルトの状態だと `history` コマンドを打ってもいつ実行されたのか分かりません。

```bash
history
```
```bash
    1  free -m
    2  top
    3  history
```

## 日時の追加
`HISTTIMEFORMAT='%F %T '` を実行すると日時が追加されるようになります。

```bash
HISTTIMEFORMAT='%F %T '
history
```
```bash
    1  2016-11-25 10:00:00 free -m
    2  2016-11-25 10:00:00 top
    3  2016-11-25 10:00:00 history
    4  2016-11-25 11:00:00 HISTTIMEFORMAT='%F %T '
    5  2016-11-25 11:00:00 history
```

## 永続化
これを永続化するために /etc/profile.d/history.sh に `HISTTIMEFORMAT` を書き込みます。
その他デフォルトから変更した方がよいものを追記しておきます。

```bash
cat << "_EOF_" > /etc/profile.d/history.sh
# history initialization

HISTTIMEFORMAT='%F %T '
HISTSIZE=100000
HISTFILESIZE=100000
HISTIGNORE='history:pwd:ls:ls *:ll:w:top:df *'      # 保存しないコマンド
HISTCONTROL=ignoreboth                              # 空白、重複履歴を保存しない
PROMPT_COMMAND='history -a; history -c; history -r' # 履歴のリアルタイム反映
_EOF_
```
項目|説明|例
---|---|---
`HISTTIMEFORMAT`|実行日時の書式設定|
`HISTSIZE`|記録される実行コマンドの最大値|
`HISTFILESIZE`|記録される実行コマンドの最大値|
`HISTIGNORE`|履歴から除外するコマンド|
`HISTCONTROL`|**ignoredups**: 重複コマンドを無視<br>**ignorespace**: 空白で始まるコマンドを無視<br>**ignoreboth**:<br>**erasedups**: 同一コマンドを無視 |
`PROMPT_COMMAND`||

#### HISTCONTROL
保存方法を制御するコロンで区切られた値のリスト。

| 値            | 内容  |
|---------------|---|
| `ignorespace` | 空白文字で始まる行を保存しない |
| `ignoredups`  | 以前の履歴と一致する行を保存しない |
| `ignoreboth`  | `ignorespace` と `ignoredups` の省略形 |
| `erasedups`   | 現在の行と一致する履歴を保存前にすべて削除 |

上記のリストにない値は無視される。
`HISTCONTROL` が設定されていない、または有効な値が含まれていない場合、シェルパーサーが読み取ったすべての行は `HISTIGNORE` の値に従って履歴に保存される。
複数行の複合コマンドの2行目以降の行は検査されず、`HISTCONTROL` の値に関係なく履歴に追加される。 [^Bash-Variables]

[^Bash-Variables]: http://www.gnu.org/software/bash/manual/bash.html#Bash-Variables

#### HISTFILE
コマンド履歴が保存されるファイル名。デフォルト値は ~/.bash_history になる。

#### HISTFILESIZE
履歴ファイルに含まれる行の最大数。この変数に値が割り当てられると、必要に応じて履歴ファイルが切り捨てられ、最も古いエントリを削除してその行数を超えないようにする。履歴ファイルはシェル終了時に書き込んだ後にこのサイズに切り捨てられる。
値が `0` の場合、履歴ファイルは 0 サイズに切り捨てられる。数値以外の値と `0` より小さい数値は切り捨てを禁止する。
シェルは、起動ファイルを読み込んだ後、デフォルト値を `HISTSIZE` の値に設定する。

#### HISTIGNORE
どのコマンドラインが履歴リストに保存されるべきかを決定づけるコロン区切りのパターンリスト。
各パターンは行頭に固定され、行と完全に一致する必要がある。（暗黙の `*` は付加されない）
各パターンは `HISTCONTROL` で指定されたチェックが適用された後、行に対して検査する。
通常のシェルパターン一致文字に加えて `&` は前の履歴行と一致する。`&` はバックスラッシュでエスケープできる。（マッチを試みる前にバックスラッシュは削除される。）
2行目以降の複数行の複合コマンドの行はテストされず、`HISTIGNORE` の値に関係なく履歴に追加される。

`HISTIGNORE` は `HISTCONTROL` の機能を包含している。`&` のパターンは `ignoredups` と同じで、 `[ ] *` のパターンは `ignorespace` と同じになる。これらの2つのパターンを組み合わせてコロンで区切ると `ignoreboth` の機能が提供される。

#### HISTSIZE
履歴リストで記憶されるコマンドの最大数。値が `0` の場合、コマンドは履歴リストに保存されない。
`0` より小さい数値はすべてのコマンドが履歴リストに保存される。
シェルは起動ファイルを読み込んだ後、デフォルト値を `500` に設定する。

#### HISTTIMEFORMAT
この変数が設定され `null` でない場合、その値は `strftime` のフォーマット文字列として使用され、履歴ビルトインによって表示される各履歴エントリに関連付けられたタイムスタンプを出力する。
この変数が設定されている場合、タイムスタンプは履歴ファイルに書き込まれ、シェルセッション間で保存される可能性がある。これは履歴コメント文字 `#` を使用して他の履歴行とタイムスタンプを区別する。

## shopt
### cmdhist
```bash
shopt -s cmdhist
```
設定されている場合、Bashは複数行のコマンドのすべての行を同じ履歴エントリに保存する。これにより複数行のコマンドを簡単に再編集できる。

### histappend
```bash
shopt -s histappend
```
設定されている場合、履歴リストはファイルを上書きするのではなく、シェルが終了するときに `HISTFILE` 変数の値で指定されたファイルに追加される。

### histreedit
```bash
shopt -s histreedit
```
設定され、Readline が使用されている場合、ユーザーは失敗した履歴置換を再編集する機会が与えられる。

### histverify
```bash
shopt -s histverify
```
設定され、Readline が使用されている場合、履歴置換の結果は直ちにシェルパーサーに渡されない。代わりに、結果の行が Readline 編集バッファにロードされ、さらに変更が可能になる。

### lithist
```bash
shopt -s lithist
```
これを有効にして `cmdhist` オプションを有効にすると、可能な場合はセミコロン区切り記号を使用するのではなく、改行を埋め込んだ複数行コマンドが履歴に保存される。

## その他
プロセスアカウンティングや script コマンドで履歴出力などもあります。