ter*_*don 23 linux terminal bash shell history
出于某种原因,我无法让我的系统在重新启动后保留我的 BASH 历史记录。以下是我的相关部分~/.bashrc:
shopt -s histappend
PROMPT_COMMAND='history -a; updateWindowTitle'
export HISTCONTROL=ignoredups
export HISTSIZE=9999
export HISTFILESIZE=999999
export HISTFILE="$HOME/.bash_history"
Run Code Online (Sandbox Code Playgroud)
据我所知,这些是所有必要的选项(我知道过去我可以在多次重新启动后保留历史记录,而过去没有所有这些)。但是,尽管在几次重新启动之前添加了这些选项,但在重新启动后我仍然丢失了大部分历史记录。它不是空的,但它没有我重新启动之前的 9999 行。
在有人抱怨之前,是的,我已经阅读了这些问题。我已经实施了他们上面列出的一些建议,其余的要么没有帮助,要么不相关:
如果那里可能有其他相关命令,您可以~/.bashrc 在此处查看我的全部内容。
那么,我错过了什么?为什么我的历史没有保存?如果有人认为另一个文件可能相关,请告诉我,我会发布它。我通过grep -i hist \.*在 my$HOME中运行来检查它显示唯一.包含字符串hist或的相关文件HIST是.bashrc.
我正在运行 Linux Mint Debian 版,GNU bash,版本 4.2.36(1)-release (x86_64-pc-linux-gnu) 和我最喜欢的终端模拟器(如果相关)是terminator.
更新:
按照@mpy 在评论中的建议,我将 my 更改~/.bashrc为 setHISTFILE=~/bash_history而不是默认值~/.bash_history,这似乎解决了交互式 shell的问题。登录 shell 仍然显示相同的行为,但历史记录在行处被截断500。但是,HIST相关文件中并没有设置相关变量:
$ for f in /etc/profile ~/.profile ~/.bash_profile ~/.bash_login; do \
echo -ne "$f :"; echo `grep HIST $f`; \
done
/etc/profile :
/home/terdon/.profile :grep: /home/terdon/.profile: No such file or directory
/home/terdon/.bash_profile :grep: /home/terdon/.bash_profile: No such file or directory
/home/terdon/.bash_login :grep: /home/terdon/.bash_login: No such file or directory
$ grep -r HIST /etc/profile.d/ <-- returns nothing
Run Code Online (Sandbox Code Playgroud)
那么,为什么设置HISTSIZEand HISTFILESIZEin~/.bashrc还不够,除非我明确地将 the 设置$HISTFILE为默认值以外的值~/.bash_history?
ter*_*don 17
问题实际上归结为登录和非登录 shell的不同行为。我已经在我的~/.bahsrc. 启动登录 shell 时不会读取此文件,它只能由交互式非登录 shell 读取(来自man bash):
当 bash 作为交互式登录 shell 或作为具有
--login选项的非交互式 shell 调用时,它首先从文件中读取并执行命令/etc/profile(如果该文件存在)。读取该文件后,它会按顺序查找 ~/.bash_profile、~/.bash_login、 和~/.profile,并从第一个存在且可读的命令中读取和执行命令。--noprofile当 shell 启动时可以使用该选项来禁止这种行为。[. . . ]
当一个不是登录 shell 的交互式 shell 启动时,bash 从 ~/.bashrc 读取并执行命令,如果该文件存在。这可以通过使用 --norc 选项来禁止。--rcfile 文件选项将强制 bash 从文件而不是 ~/.bashrc 读取和执行命令。
因此,每次我登录、删除到 tty 或使用 ssh 时,.history文件都会被截断,因为我也没有将其设置为正确的大小~/.profile。我终于意识到这一点,并简单地将变量设置~/.profile 在它们所属的位置,而不是~/.bashrc
所以,我~/.history被截断的原因是因为我只在交互式非登录 shell 读取的文件中设置了 HISTORY 变量,因此每次我运行不同类型的 shell 时,变量都会被忽略,文件将被剪切因此。
mpy*_*mpy 12
我的建议是使用另一个文件作为HISTFILE,而不是默认的~/.bash_history.
虽然我没有分析性的解释,但我将尝试概述是什么导致我提出这个建议:如果您将其bash用作默认(登录)shell 并使用X(这两种情况都非常可能),那么您bash在(图形) 登录:
systemd
...
|-login
| `-bash <<====
| `-slim
| |-X -nolisten tcp vt07 -auth /var/run/slim.auth
| | `-{X}
| `-fluxbox
| `-xterm -bg black -fg white
| `-bash
...
Run Code Online (Sandbox Code Playgroud)
我认为这个实例是一个登录 shell,所以它不会读取你的~/.bashrc,因此不会知道任何关于该histappend选项的信息:
man bash(1):当一个不是登录shell的交互式 shell启动时,bash 从 /etc/bash.bashrc 和 ~/.bashrc 读取并执行命令,如果这些文件存在的话。(……)
只要这个“父外壳”运行,一切都很好,但是在它终止(即系统停止)时,它将覆盖~/.bash_history(因为这是默认值)并弄乱您的历史记录或在系统启动时将其剪辑到(再次默认)500线。(或者两者都有……)
我也感到震惊的是,在 中包含历史配置是不够的~/.bashrc,因为这不应该是一个不常见的设置。我对此没有任何解释。
关于您的问题,即“登录外壳仍然显示相同的行为”,您可以尝试将历史配置也包含在~/.bash_profile:
man bash(1):当 bash 作为交互式登录 shell 或作为带有 --login 选项的非交互式 shell 调用时,它首先从文件 /etc/profile 中读取并执行命令(如果该文件存在)。读取该文件后,它会查找 ~/.bash_profile, (...)
不幸的是,我无法用我自己的bash配置中的详细信息发布更合理的解释,因为我是一个zsh人......
| 归档时间: |
|
| 查看次数: |
8178 次 |
| 最近记录: |