.bash_history: Does it always record every command

2020-05-28 10:26发布

I'd like to be able to look through my command history (all the way back to the beginning of the user).

Is there any guarantee that .bash_history will continue to be appended to?

If there is a limit where the file will start to be truncated (hopefully from the beginning) is there a way to remove that limit?

标签: linux bash
5条回答
聊天终结者
2楼-- · 2020-05-28 10:48

man bash is your friend: The HISTFILESIZE variable:

The maximum number of lines contained in the history file. When this variable is assigned a value, the history file is truncated, if necessary, by removing the oldest entries, to contain no more than that number of lines. The default value is 500. The history file is also truncated to this size after writing it when an interactive shell exits.

查看更多
相关推荐>>
3楼-- · 2020-05-28 10:49

Adam suggested that unsetting size limits doesn't cut it, but you can avoid other instances of shell to change HISTSIZE, HISTFILESIZE, ... by setting readonly flag on them in /etc/profile.

unset HISTSIZE
unset HISTFILESIZE
readonly HISTFILE HISTFILESIZE HISTSIZE HISTCONTROL HISTIGNORE HISTTIMEFORMAT
查看更多
女痞
4楼-- · 2020-05-28 11:04

Also note. By default if you work with multiple login sessions (I usually 2 or 3 putty windows logged into the same server), they do NOT see eachothers history.

Also it appears that when I exit all the shells its the last one to exit is the one which is saved back the file (i.e. is visible when I start work the next day). So I assume bash is keeping the history in memory and then flushes to the file on exit, at least thats my guess based on what I see.

查看更多
一纸荒年 Trace。
5楼-- · 2020-05-28 11:05

If you want all commands from all sessions appended to the history instantly (so that you can use commands from one session immediately in another), you can put the following lines into your .bashrc :

unset HISTSIZE
unset HISTFILESIZE
HISTCONTROL=erasedups

# append to the history file, don't overwrite it
shopt -s histappend
# multi-line commands should be stored as a single command
shopt -s cmdhist

# sharing of history between multiple terminals 
# histfile has to be read and saved after each command execution
PROMPT_COMMAND="history -n; history -w; history -c; history -r; $PROMPT_COMMAND"

More information about these commands can be found here: Preserve bash history in multiple terminal windows

查看更多
Viruses.
6楼-- · 2020-05-28 11:07

There is a number of environment variables that control how history works in bash. Relevant excerpt from bash manpage follows:

   HISTCONTROL
          A colon-separated list of values controlling how commands are saved on the history list.  If the list of values includes ignorespace,  lines  which
          begin  with  a space character are not saved in the history list.  A value of ignoredups causes lines matching the previous history entry to not be
          saved.  A value of ignoreboth is shorthand for ignorespace and ignoredups.  A value of erasedups causes all previous  lines  matching  the  current
          line  to be removed from the history list before that line is saved.  Any value not in the above list is ignored.  If HISTCONTROL is unset, or does
          not include a valid value, all lines read by the shell parser are saved on the history list, subject to the value of HISTIGNORE.   The  second  and
          subsequent lines of a multi-line compound command are not tested, and are added to the history regardless of the value of HISTCONTROL.
   HISTFILE
          The  name  of the file in which command history is saved (see HISTORY below).  The default value is ~/.bash_history.  If unset, the command history
          is not saved when an interactive shell exits.
   HISTFILESIZE
          The maximum number of lines contained in the history file.  When this variable is assigned a value, the history file is truncated, if necessary, by
          removing  the  oldest entries, to contain no more than that number of lines.  The default value is 500.  The history file is also truncated to this
          size after writing it when an interactive shell exits.
   HISTIGNORE
          A colon-separated list of patterns used to decide which command lines should be saved on the history list.  Each pattern is anchored at the  begin-
          ning  of  the line and must match the complete line (no implicit `*' is appended).  Each pattern is tested against the line after the checks speci-
          fied by HISTCONTROL are applied.  In addition to the normal shell pattern matching characters, `&' matches the previous history line.  `&'  may  be
          escaped  using  a  backslash; the backslash is removed before attempting a match.  The second and subsequent lines of a multi-line compound command
          are not tested, and are added to the history regardless of the value of HISTIGNORE.
   HISTSIZE
          The number of commands to remember in the command history (see HISTORY below).  The default value is 500.

To answer your questions directly:

No there isn't a guarantee, since history can be disabled, some commands may not be stored (e.g. starting with a whitespace) and there may be a limit imposed on the history size.

As for the history size limitation: if you unset HISTSIZE and HISTFILESIZE:

unset HISTSIZE
unset HISTFILESIZE

you'll prevent the shell from truncating your history file. However, if you have an instance of a shell running that has these two variables set, it will truncate your history while exiting, so the solution is quite brittle. In case you absolutely must maintain long term shell history, you should not rely on shell and copy the files regularly (e.g. using a cron job) to a safe location.

History truncation always removes oldest entries first as stated in the manpage excerpt above.

查看更多
登录 后发表回答