5

私はbashの「history」コマンドが嫌いです。必要な履歴アイテムが見つかりません。時々私は私が欲しいものを'履歴で得ることができます| grep XXX'ですが、履歴が長すぎる(400以上のヒット!イェーイ)か、短すぎる(ヒットなし。ブー)ことがよくあります。

基本的に「スター」固有の履歴アイテムを作成し、グローバルスターリストとcwd固有のスターリストの両方を使用して、それらを常に履歴に表示できるようにする小さな「履歴ヘルパー」コマンドを作成しないでください。

素晴らしそうですね。だから私はこれを行うことによって歴史を素朴に読もうとしました:

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

ああ、それはうまくいきませんでした。ああ、わかりました。system()コマンドは独自のコンテキストで実行され、bashの履歴にアクセスできません。ドラッツ。では、 〜/.bash_historyを読んでみます

ba baaa〜いいえ。これは、a)history -w、またはb)シェルを終了するための呼び出しのいずれかへの最後の呼び出しまでの履歴のみを取得します。

それで、質問:Cの現在のbash履歴にプログラムでアクセスするにはどうすればよいですか?

(注:いいえ、〜/ .bash_historyの内容、現在履歴、プロンプトから「history」と入力したときに表示される正確な出力ではありません。また、なぜCを尋ねるのですか?なぜですか...しかし、実際には、私はすでに便利なncursesラッパーを使用して、通常の端末で高度なオートコンプリートとサブ選択の履歴を検索できるようにします...)

編集:お願いします、貢献するのに役立つ何かがあれば、それを聞いてうれしいですが、「bashの履歴のマニュアルページを読むべきです」のようなコメントに少しうんざりします。

私はそれらを読みました。履歴アイテムに「スター」を付けて、常に履歴に表示させることはできませ。また、ディレクトリごとの履歴コンテキストを維持することもできます。これらは、歴史がサポートしていないものです。これに感謝します。そのため、特定の目的のためにヘルパー関数を作成したいと思います。「履歴のマニュアルページをもう少し読む必要があるかもしれません」などのコメントがある場合は、そのままにして、応答しないでください。それは私の質問に実際には対応していません。:)

4

3 に答える 3

2

簡潔な答え

組み込みのhistoryソースに答えがあります。bash

長い答え

しばらく読むだけでいいようですhelp historyman bash

履歴ファイルはシェルで常に書き換えられています (設定によって異なります。デフォルトでは、ログアウト/終了時に行われます)。そのためには、シェルをハックして特定のルールを追加する必要があります。しかし、あなたはこのレベルからかなり離れています。

cあなたがそれにかなり近かったなら、あなたは .bash_history from =)で操作する方法を尋ねなかったという理由だけで

ただし、履歴を改善する別の方法があります。履歴のサイズを増やし、重複した読み取りを制限し、すべてのコマンドが実行直後に履歴に記録されるようにします。.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
}

スター付き履歴コマンド

基本的な原則は、いくつかのシェル関数ロジックを組み合わせて、履歴ヘルパー プログラムの履歴を読み書きすることです。

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 に答える