如何以编程方式访问C中的bash命令历史记录?

时间:2012-08-15 08:17:08

标签: c bash

我讨厌bash'history'命令。它永远不会找到我想要的历史项目。有时我可以用'历史|得到我想要的东西grep XXX',但往往是历史太长(400次点击!yay)或太短(没有点击。嘘)。

我心想,为什么我不写一个'历史帮手'命令让我基本上'明星'特定的历史项目,并让他们总是在我的历史中出现,同时具有全局性明星名单和cwd特定明星名单。

听起来很棒。所以我天真地尝试通过这样做来阅读历史:

system("history > blah")
FILE *fp = fopen("blah", "r")

哦,那不起作用。啊,我明白了,system()命令在它自己的上下文中运行,无法访问bash历史记录。 Drats。好的,所以我会尝试阅读〜/ .bash_history

巴巴啊〜不。这只是历史记录,直到最后一次调用a)历史-w,或b)调用退出shell。

所以,问题:我如何以编程方式访问C中的当前bash历史记录?

(注意:不,〜/ .bash_history中的内容,当前历史记录,当您从提示符输入“历史记录”时看到的确切输出;还,为什么C问你?为什么不呢......但实际上,因为我已经有了一个方便的ncurses包装器,我将用它来让我在普通终端上进行花哨的自动完成和子选择历史搜索...)

编辑:如果你有一些有用的东西可以贡献,我很高兴听到它,但我有点厌恶像“你应该阅读bash历史手册页”这样的评论。

我读过它们。 nothing 允许我“加注”历史记录项并让它始终显示在我的历史记录中,并且 nothing 允许我维护每个目录的历史记录上下文。这些是历史不支持的事情。我很欣赏这个。这就是为什么我想写一个帮助函数,为了我的特定目的。如果你有一个评论,“也许你应该阅读更多的历史手册页”,请把它拿进来,不要回应;它并没有真正解决我的问题。 :)

3 个答案:

答案 0 :(得分:2)

简短回答

您可以在history内置bash来源找到答案。

答案很长

看起来您需要阅读help historyman bash一段时间。

您的历史记录文件会不断用shell重写(取决于您的设置。默认情况下,它会在退出/退出时刻完成)。您需要破解shell以添加特定规则来执行此操作。但是你离这个级别还很远。

只是因为如果你非常接近它,你没有问过如何使用c =)中的.bash_history进行操作

然而,还有另一种方法可以改善您的历史记录:增加历史记录大小,限制重复阅读并使所有命令在执行后立即进入历史记录。为此,您需要将.bashrc个变量放入其中:

PROMPT_COMMAND='history -a;history -n'

export HISTCONTROL=ignoredups
export HISTTIMEFORMAT='%F %T '
export HISTSIZE=100500

shopt -s histappend
shopt -s cmdhist

您也可以使用

阻止录制特定命令
export HISTIGNORE="unwanted_command:unwanted_mask*"

希望它会对你有所帮助。

答案 1 :(得分:2)

特定于工作目录的历史记录

function cd {
    builtin cd "$@"
    if [ -f .cwdhist ]; then
        history -r .cwdhist
    fi
}

已加星标的历史记录命令

基本原则是结合一些shell函数逻辑来编写和读取历史帮助程序周围的历史记录。

function histedit {
    history -a
    historyhelper $HOME/.bash_history $HOME/.histout
    history -c
    history -r $HOME/.histout
}

history -a命令将所有近期历史记录追加到历史记录文件中。然后该函数调用您的历史帮助器。您可以将所需的任何智能放入此程序中,确保您喜欢的命令在历史记录中,如果不是,则添加它们,然后将其输出保留在.histout(或其他)中。然后该函数继续,清除并重新加载历史记录。也许它应该避免清除历史。或者,如果historyhelper返回非零退出状态,则函数应该中止。你可以在这里做各种各样的事情。

答案 2 :(得分:0)

最接近的是

alias cmd="history | cmd"

并从应用程序中读取标准输入。