.bash_history不会在Git for Windows中更新(git bash)

fra*_*mon 36 windows git bash git-bash

我正在使用Git for Windows(版本1.7.8-preview20111206),即使我的HOME文件夹中有.bash_history文件,它也永远不会自动更新.当我启动Git Bash时,我可以在历史命令中看到我手动添加到.bash_history文件中,但它不会自动更新.

我使用该shopt -s histappend命令确保每次关闭shell时都保存历史记录,但它不起作用.

如果我手动使用该history -w命令,那么我的文件会更新,但我想了解为什么shopt命令不起作用,因为我理解它应该.

任何人都可以告诉我为什么会发生这种行为?

提前致谢

小智 51

我把它放在我的 ~/.bash_profile

PROMPT_COMMAND='history -a'
Run Code Online (Sandbox Code Playgroud)

  • 要避免行结束问题,您只需在Git bash中键入`echo"PROMT_COMMAND ='history -a'">>〜/ .bash_profile`,即可将行添加到.bash_profile文件的末尾(或创建新行)一个如果不存在的话). (3认同)
  • 这可以在Visual Studio Code中运行git的bash,但我不得不将它放置为〜/ .bashrc而不是〜/ .bash_profile。 (3认同)
  • 我更喜欢选项“-n”而不是“-a”:https://ss64.com/bash/history.html (3认同)
  • 这对我来说是Win 7 64位的.将头发撕掉一段时间是不行的 - 然后意识到我是用Windows线端创建的,这打破了.如果遇到问题,请仔细检查您是否使用支持此功能的编辑器保存了Unix行结尾 - 而不是记事本! (2认同)
  • @Godsmith你错过了命令中的'P':`PROM*P*T_COMMAND = ...` (2认同)
  • 这也适用于我在 Win10 上。上面的代码使 bash 附加到每个命令的历史文件中,[根据 AskUbuntu 中的回答](https://askubuntu.com/questions/67283/is-it-possible-to-make-writing-to-bash-history -即时)。 (2认同)

fra*_*acz 21

正如在这里所说的,要在Windows上保存git bash历史记录,您不能使用X按钮关闭终端.请改用exit命令.无论接受的答案中提到的配置如何,都将保存命令历史记录.

  • 您还可以按“Ctrl+D”而不是输入“exit”,它使用起来更快更简单。它甚至比使用“关闭”按钮还要快! (5认同)
  • 这很有用,但我会很难记住这一点. (4认同)
  • @Chance 幸运的是,你不再需要记住这一点,因为在 Windows 版 Git 的新版本中,情况并非如此。在win7和win10上使用2.9.3版本进行测试。 (3认同)
  • @Superole在我的机器上不正确.我有Windows 8.1的git 2.12.2(最新的04/17),我知道的唯一保存历史记录的方法是在点击x按钮之前输入"exit" (2认同)
  • 遗憾的是,当 Windows 更新应用并重新启动时也会发生这种情况。 (2认同)

And*_*ddo 16

创建以下文件

~/.bash_profile
~/.bashrc
Run Code Online (Sandbox Code Playgroud)

并将以下行放在他们两个中

PROMPT_COMMAND='history -a'

要从控制台 (git bash) 本身执行此操作,请使用以下命令

echo "PROMPT_COMMAND='history -a'" >> ~/.bash_profile
echo "PROMPT_COMMAND='history -a'" >> ~/.bashrc
Run Code Online (Sandbox Code Playgroud)

什么history -a意思

history --help命令

-a 将此会话的历史行附加到历史文件中

什么是PROMPT_COMMAND

Bash 提供了一个名为 PROMPT_COMMAND 的环境变量。在 Bash 显示提示之前,此变量的内容作为常规 Bash 命令执行。

.bash_profileAND之间的区别.bashrc

.bash_profile为登录 shell 执行,而.bashrc为交互式非登录 shell 执行。

当您通过控制台登录(输入用户名和密码)时,无论是坐在机器上,还是通过 ssh 远程登录: .bash_profile 在初始命令提示符之前执行以配置您的 shell。

但是,如果您已经登录到您的机器并打开一个新的终端窗口 (xterm),那么 .bashrc 将在窗口命令提示符之前执行。当您通过在终端中键入 /bin/bash 来启动新的 bash 实例时,.bashrc 也会运行。

在 OS X 上,默认情况下终端每次都会运行登录 shell,因此这与大多数其他系统略有不同,但您可以在首选项中进行配置。

参考

https://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x264.html https://apple.stackexchange.com/questions/51036/what-is-the-difference-between-bash-profile-and -bashrc

  • 感谢您详细解释它的工作原理和原因,以及有关“.bash_profile”和“.bashrc”配置文件之间差异的信息。 (11认同)

Syl*_*ain 12

Pablo R. 和 LinuxSecurityFreak 在Unix Stackexchange上有一个更完整的答案。将以下内容添加到您的~/.bashrc

# Avoid duplicates
HISTCONTROL=ignoredups:erasedups
# When the shell exits, append to the history file instead of overwriting it
shopt -s histappend

# After each command, append to the history file and reread it
PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND$'\n'}history -a; history -c; history -r"
Run Code Online (Sandbox Code Playgroud)

不过请小心:

此解决方案的问题PROMPT_COMMAND在于,每个历史记录项的编号在每个命令后都会发生变化。例如,如果您键入history(1) ls(2) rm,然后!1重复 (1) ,则历史记录编号可能会更改并且可能会运行该rm命令。克里斯·金普顿


Rem*_*ona 6

如果您对Windows 8使用git bash,只需将其放在〜/ .bash_logout文件中:

history > .bash_history
Run Code Online (Sandbox Code Playgroud)

显然你需要一个〜/ .bash_history文件.

问候.

  • 出于某种原因,这对我不起作用.Win7 x64. (2认同)
  • @CamiloMartin - 请参阅上面关于确保使用Unix行结尾的评论(我使用过.bash_profile). (2认同)
  • @psdie感谢您的单挑!EOLs,那些混蛋. (2认同)
  • 不适合我.正如@fracz上面指出的那样,问题是如果你用右上角的X关闭窗口,Git bash不会保存历史记录. (2认同)

Chr*_*ris 5

如果您在VSCode 中使用 Git bash,请参阅上面的 CM 评论。

这适用于在 Visual Studio Code 中运行 git 的 bash,但我不得不把它放在 ~/.bashrc 而不是 ~/.bash_profile。– CM 7 月 29 日 14:43

这为我解决了它。