在bash脚本中运行时,“历史记录”停止工作


9

我正在编写一个简单的脚本来grep我的bash历史记录以查找特定的字符串。在命令行上,我可以执行以下操作,效果很好:

history | grep git

但是,当我使用与上述相同的命令创建bash脚本时,突然不history返回任何内容:

#!/bin/bash
history | grep git

当我删除第一行时#!/bin/bash,我的脚本再次起作用。这是怎么回事 如何history在bash脚本中使用?

Answers:


8

以下内容适用于bash 4.0 or higher only,但可以解决问题。:)

#!/bin/bash -i
history | grep sometext

作品!试试看。(-i= nteractive,旗标提供给bash的3.x和更早版本)


也要感谢这位花花公子最近因为我可以而拒绝了我。(可能是bashv3用户,完全出于沮丧,哈哈)。至少对于马丁来说,我的解决方案有很大帮助,这(至少)很舒服。
语法错误,2015年

当我编写一个为24/7支持工程师记录下班时间工作的工具时,我遇到了同样的问题。谢谢!
亨利·范·梅根

14

当您运行bash shell脚本时(例如,通过运行shebang行为的可执行文件)#!/bin/bash,该脚本将在非交互式shell中运行。非交互式外壳的功能之一是禁用历史记录。因此,如果您希望脚本能够使用历史记录,则需要执行以下操作:

#!/bin/bash
HISTFILE=~/.bash_history   # Or wherever you bash history file lives
set -o history             # enable history
history | grep git

当然,在这种情况下,您可以完成以下操作:

grep git ~/.bash_history

由于以上两种情况都要求历史记录文件(~/.bash_history)是最新的,因此几乎可以肯定不会。

我不确定在删除shebang行后如何运行脚本。采购文件(如,与.)是一样的运行脚本,因为里面确实有历史在当前shell中运行命令,启用。


关于做什么history -a,使set命令之后确定最后的命令添加到文件第一?

4
@illuminÉ:无济于事。开始运行脚本的shell是一个完全不同的过程。它以新的空历史开始。
rici 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.