5

我讨厌 bash 'history' 命令。它永远找不到我想要的历史项目。有时我可以通过“历史 | 得到我想要的”。grep XXX' 但通常要么历史太长(400+ 点击!耶)要么太短(没有点击。嘘)。

我心想,我为什么不写一个小“历史助手”命令,让我基本上“加星”特定的历史项目,并让它们总是出现在我的历史中,有一个全局星表和一个 cwd 特定星表。

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

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

哦,那没用。啊,我明白了,system() 命令在它自己的上下文中运行,并且无法访问 bash 历史记录。德拉斯。好的,所以我会尝试阅读~/.bash_history

咩咩~不。只有在最后一次调用 a) history -w 或 b) 调用退出 shell 之前,历史记录才会出现。

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

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

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

我读过它们。没有什么可以让我为历史项目“加注星标”并让它始终出现在我的历史中,也没有什么可以让我维护每个目录的历史上下文。这些都是历史所不支持的。我很欣赏这个。这就是为什么我想为我的特定目的编写一个辅助函数。如果您有类似“也许您应该多阅读历史手册页”之类的评论,请忍住,不要回复;它并没有真正解决我的问题。:)

4

3 回答 3

2

简短的回答

您可以在内置的history源代码中找到答案。bash

长答案

看起来你只需要阅读help history一段man bash时间。

您的历史文件不断用 shell 重写(取决于您的设置。默认情况下,它是在注销/退出时刻完成的)。你需要破解 shell 来添加特定的规则来做到这一点。但是你离这个水平还很远。

只是因为如果你非常接近它,你没有问如何使用 .bash_history from c=)

然而,还有另一种改进历史记录的方法:增加历史记录大小,限制重复阅读,并使所有命令在执行后立即进入历史记录。为此,您需要放入.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*"

希望它会帮助你。

于 2012-08-15T08:33:03.400 回答
2

工作目录特定历史

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

已加星标的历史命令

基本原理是结合一些shell函数逻辑来围绕你的history helper程序写和读history。

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

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

于 2012-08-16T04:41:53.787 回答
0

你能得到的最接近的是

alias cmd="history | cmd"

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

于 2012-09-08T10:42:16.583 回答