フォルダ内の「ローカル」bash履歴を覚えていますか?


11

長い引数で使用するフォルダーにスクリプトがあります。履歴全体をさかのぼる代わりに、その特定のディレクトリで実行されたコマンドの履歴を保持できる可能性はありますか?


3
興味深い質問です。ところで、「履歴全体」をさかのぼる代わりに、Ctrl + Rを使用して検索することができます。そのような状況では、これを行います。
16年

ええ、それは役に立ちますが、このように私は最後のものしか持っていません。複数の結果が出る可能性はありますか?
2016年

1
コマンド名の一部を入力したら、Ctrl + Rを押し続けることができます。
mtahmed 2016年

history | lessたぶん?それは本当にあなたの質問に答えませんが、それは私が始めるところです。
roaima 2016年

@roaima次に、"/" + search-term + enterを使用して検索し、さらに"n" / "N"を使用して、前方/後方をさらに検索します。
2016年

回答:


2

bashのPROMPT_COMMANDにフックすることにより、この関数は新しいプロンプトが表示されるたびに実行されるため、カスタム履歴が必要なディレクトリにいるかどうかを確認するのに適切な時間です。この関数には4つのメインブランチがあります。

  1. 現在のディレクトリ($PWD)が変更されていない場合は、何もしません(戻る)。

PWD 変更された場合、「カスタムディレクトリ」コードを1つの場所に分解することのみを目的とするローカル関数を設定します。あなたは私のテストディレクトリをあなた自身のもの(で区切られている|)に置き換えたいでしょう。

  1. カスタムディレクトリを変更していない場合は、「前のディレクトリ」変数を更新して、関数を終了します。

ディレクトリを変更したので、「前のディレクトリ」変数を更新し、メモリ内の履歴をHISTFILEに保存してから、メモリ内の履歴をクリアします。

  1. カスタムディレクトリに変更た場合は、HISTFILEを.bash_history現在のディレクトリのファイルに設定します。

  2. それ以外の場合、カスタムディレクトリから変更したため、HISTFILEをストックディレクトリにリセットします。

最後に、履歴ファイルを変更したので、その前の履歴を読み返します。

処理を行うために、スクリプトはPROMPT_COMMAND値を設定し、2つの内部使用変数(ストックHISTFILEと「前のディレクトリ」)を保存します。

prompt_command() {
  # if PWD has not changed, just return
  [[ $PWD == $_cust_hist_opwd ]] && return

  function iscustom {
    # returns 'true' if the passed argument is a custom-history directory
    case "$1" in
      ( */tmp/faber/somedir | */tmp/faber/someotherdir ) return 0;;
      ( * ) return 1;;
    esac
  }

  # PWD changed, but it's not to or from a custom-history directory,
  # so update opwd and return
  if ! iscustom "$PWD" && ! iscustom "$_cust_hist_opwd"
  then
    _cust_hist_opwd=$PWD
    return
  fi

  # we've changed directories to and/or from a custom-history directory

  # save the new PWD
  _cust_hist_opwd=$PWD

  # save and then clear the old history
  history -a
  history -c

  # if we've changed into or out of a custom directory, set or reset HISTFILE appropriately
  if iscustom "$PWD"
  then
    HISTFILE=$PWD/.bash_history
  else
    HISTFILE=$_cust_hist_stock_histfile
  fi

  # pull back in the previous history
  history -r
}

PROMPT_COMMAND='prompt_command'
_cust_hist_stock_histfile=$HISTFILE
_cust_hist_opwd=$PWD

0

ジェフの答えは、単一のディレクトリの履歴が必要な場合は素晴らしいですが、zshのインストールに問題がない場合は、per-history-directoryを使用して、すべてのディレクトリのディレクトリに固有の履歴を取得できます。

次の方法でzshをインストールできます。

brew install zsh

あるいは、oh-my-zshをインストールしたい場合は、histdbプラグインを追加して、histdbが追加するsqlite dbをクエリするカスタムクエリを作成することができます。これについては、Dev Diariesの投稿で自動補完を追加しました。ボーナスコマンドセクションを確認してください。

クエリは次のようになります

show_local_history() {
    limit="${1:-10}"
    local query="
        select history.start_time, commands.argv 
        from history left join commands on history.command_id = commands.rowid
        left join places on history.place_id = places.rowid
        where places.dir LIKE '$(sql_escape $PWD)%'
        order by history.start_time desc
        limit $limit
    "
    results=$(_histdb_query "$query")
    echo "$results"
}

これは、オプションの制限も受け入れます。

show_local_history 50

例えば。


-1

長い引数を持つコマンドを数回使用する必要がある場合は、通常、自分でエイリアスを作成するか、必要に応じてエイリアスを自分に追加~/.bash_aliasesできます~/.bashrc。簡単で時間を節約でき、代わりに履歴から古いコマンドを探すことができます。


1
これは良いヒントですが、OPが探していたものではありません。OPは彼/彼女が探していたもの(私がBTWと同様にサインアップするソリューション)に対してかなり具体的でした。
16年

@phkそうです、次回はもっと注意します!説明ありがとうございます!
andreatsh
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.