ディレクトリごとのbash / zsh履歴ログファイル


14

セットディレクトリ内のプロジェクトで多くの作業を行っていることがわかりました。時々-数か月後-そのプロジェクトで何かをやり直す必要がありますが、自分が何をしたか思い出せません。私はmercurialまたはgitを使用してファイルの変更を追跡しますが、そのディレクトリで発行したコマンドを覚えておく必要があります。

シェルの履歴を検索することはあまり有益ではありません。私はすでにすべての。* _ historyファイルにログを記録していますが、〜/ foo / barで行ったことのリストが必要であり、その週に行った他の(百万)ものすべてではありません。その特定のプロジェクトで最後に働いた月を思い出すことさえできないでしょう。

誰も私が使用したすべてのシェルコマンドのプロジェクトディレクトリログファイルのアイデアを持っていますか?私は次のようなコマンドを想定しています:

workon myproject

...これは、シェルログファイルを〜/ myproject / .history.logに設定し、そのログファイルから以前の履歴をロードし、プロンプトを更新して、作業中のディレクトリを通知します(たとえば、バージョンを提供するvcpromptなど)制御情報)。

このようなものはありますか?

回答:


4

まだこれを理解していない場合:探しているのは優れたvirtualenvwrapperパッケージです。これはpythonのvirtualenvのラッパーであり(図を参照)、Python環境についてよく参照されますが、実際にはユースケースを満たす非常に汎用的なツールです。

設置

pip install virtualenvwrapper

または

easy_install virtualenvwrapper

シェル構成に初期化のものを追加します(~/.zshrc, ~/.bashrc

export WORKON_HOME=$HOME/.virtualenvs
export PROJECT_HOME=$WORKON_HOME/projects
export PIP_VIRTUALENV_BASE=$WORKON_HOME
export PIP_RESPECT_VIRTUALENV=true
source /usr/local/bin/virtualenvwrapper.sh

使用法

# create your env
mkvirtualenv my_project

# edit per project hooks
vim ~/.virtualenvs/my_project/bin/{postactivate,preactivate,predeactivate,etc}

# work in this env
workon my_project

また~/.virtualenvs/{postactivate,postdeactivate,etc}、毎回呼び出される汎用フックもありますworkon any_project

したがって、たとえば、フックに行export HISTFILE="$VIRTUAL_ENV/bash_history"がある~/virtualenvs/postactivateということは、$HISTFILE変数が毎回異なるプロジェクトに展開されることを意味します。


3

私もこれが必要で、BashのPROMPT_COMMAND変数を使用するバージョンを思いつきました。

変数PROMPT_COMMANDの値は、Bashが各プライマリプロンプトを出力する直前に調べられます。PROMPT_COMMANDが設定されており、null以外の値がある場合、コマンドラインで入力された場合と同じように値が実行されます。

だから私は〜/ .bashrc.myでPROMPT_COMMAND = "check_for_local_history"と言います。ここcheck_for_local_historyは私の機能で、最後に実行されたコマンドがディレクトリの変更であったかどうかをチェックします。 。存在する場合は、履歴ファイルとして使用します。

ここに完全な要点があります:https : //gist.github.com/gurdiga/dac8d2e7eb3056d6b839


2

製品のサブパッケージを構築するフレームワークに使用する1つのトリックは、サブシェルを使用することです。

bashの場合、次のようなシェルスクリプトを作成できます。

#!/bin/bash

export PROJECT_DIRECTORY=$(pwd)

exec bash --rcfile $HOME/.project-bashrc

次に、$HOME/.project-bashrcあなたはこのようなものを入れます:

source $HOME/.bashrc
export HISTFILE="${PROJECT_DIRECTORY}/.bash_history"
cd "${PROJECT_DIRECTORY}"

これにより、.project-bashrcファイル内のプロンプトをカスタマイズすることもできます。これは便利です。

で同じことをする方法がわかりませんzshZDOTDIR変数をオーバーライドする必要があると思います。しかし、それは似ているでしょう。

チャオ!


1

ここで私のロギングスクリプトを見てください。それらのいずれかを使用すると、各コマンドを発行するときにどのディレクトリにいるかを追跡できます。grepコマンドまたはその他の情報のログファイルを作成できます。自宅と職場で長いバージョンを使用しています。


おかげで-私はこれを見ていきます。私が必要なものに近い何かをするかもしれません!
サイモン

1

zshのディレクトリ履歴と呼ばれる、私が書いたプラグインに興味があるかもしれません。
こちらをご覧くださいhttps : //github.com/tymm/directory-history

myprojectワークフローの作業には実際には適合しませんが、ニーズに完全に適合するはずです。

ディレクトリを含む履歴を作成します。
履歴を検索すると、まず現在のディレクトリからコマンドを取得します。
そのディレクトリにコマンドが残っていない場合、グローバル履歴にフォールバックし、他のディレクトリで使用されているコマンドを提案します。


1

単純なものが必要な場合は、次のような.history.logファイルを作成できます。

#!/bin/cat
some
relevant
commands

次に、ファイルをcat実行すると、リストしたコマンドが実行されます。
また、機能として慣例として、これらのコマンドを個別のファイルにグループ化することもできます。

.howto.datadump
.howto.restart

これには、すぐに使用でき、環境を汚染しないという利点があります。


または、トピックごとにREADME.md他の.mdファイルを使用または作成し、readmeからそれらを指すことができます。これは、マークダウンフレンドリーなソース管理インターフェイスがある場合です。
リノ

1

ディレクトリのローカル履歴ファイルを取得するには、bashプロンプトコマンドに次の行を追加しました。

if [ -f .local_history ] ; then tail -1 $HISTFILE >> .local_history ; fi

touch .local_historyディレクトリ内のコマンドは、メインの履歴ファイルを失うことなく、そのディレクトリで実行されたすべてのコマンドのローカル履歴ファイルを提供します。同様の何かが私が推測するzshで動作するでしょう。


0

少なくともbashでは、HISTFILEはシェルインスタンスの開始時にのみ参照されます。上記の「workon」の例でシェルインスタンスが作成されない限り、ディレクトリごとのアイデアはここでは機能しません。

たぶんあなたは次のようなものを見ることができます

alias workon='script ./.history.log'

しかし、スクリプトはサブシェルも作成します。

要するに、これを機能させるには、おそらく乱雑なレベルのサブシェルが必要になります。


くそー、私はそれが簡単なものになることを望んでいた。とにかくありがとう!
サイモン

0

私は、さまざまな機能のために新しいユーザーとグループを作成するだけのプロダクションソフトウェアハウスで働いてきました。グループメンバシップとACLを介して他の関連する機能領域をさまざまなレベルで可視化する構成管理またはソフトウェアビルド専用の新しいユーザーアカウント、およびたとえば実行されたコマンド履歴cmmgrはに保存され~cmmgr/.bash_historybldmgr関連する単語はに保存されます~bldmgr/.bash_history。ログインするには、ユーザーはログインディレクトリを所有する必要があります。したがって、プロジェクト領域は完全に別のディスクに設定されました。ファイル作成者の所有権は、どの機能領域がプロジェクト領域にファイルを作成したかを示しており、適切な.bash_historyものを調べることができます。

ただし、上記のアプローチでは希望する粒度は得られませんが、グループメンバーシップと組み合わせると、ユーザーはグループを切り替えnewgrpて新しいシェルと環境を効果的に作成し、それを使用することができるスケルトンを提供します他の回答で与えられたアプローチの中で、帽子切り替える~/.bash_historyときに有効なファイルを変更して、コマンドを使用して新しいグループに出入りするときにフォルダごとに使用および保存されるものを管理できるようにします。チェックしてください。この質問に対する他の回答には、これらの線に沿った出発点がいくつかあります。これらはUNIXグループパラダイムで動作するはずです-ほとんどのナットとボルトは、シェルによって制御されるシェルの起動および終了ルーチンによって処理されます。cmmgrnewgrp~/.bash_historynewgrpman newgrpnewgrp呼び出し。チェックアウトnewgrp -l

NAME
     newgrp -- change to a new group

SYNOPSIS
     newgrp [-l] [group]

DESCRIPTION
     The newgrp utility creates a new shell execution environment with modified real and effective group
     IDs.

     The options are as follows:

     -l      Simulate a full login.  The environment and umask are set to what would be expected if the user
             actually logged in again.

0

ここでは2つのバリエーションを紹介しますが、Z Shellにのみ適用できます。

バリアント1

これは、質問のタイトルを読むときに最初に考えたものです。このバリアントでは、ALT+で2つの履歴モードを切り替えることができますhグローバルまたはローカル。後者は、chdir時にディレクトリごとの履歴に自動的に切り替わります。グローバル履歴には発行されたすべてのコマンドが蓄積されます。

  • デモンストレーション

    〜ソースsrc / cd_history
    〜グローバル履歴をエコーする                                                
    世界史
    〜mkdir foo bar                                                      
    〜[ALT-h]ローカル履歴のインジケーターに注意->    +
    〜cd foo +
    〜/ foo fooのローカル履歴をエコーし​​ます+
    fooの地方史
    〜/ foo fc -l +
        1 fooのローカル履歴をエコーし​​ます
    〜/ foo cd ../bar +
    〜/ barローカル履歴をバーにエコーします+
    バーの地元の歴史
    〜/ bar fc -l +
        1ローカルヒストリーをバーにエコー
    〜/ bar cd ../foo +
    〜/ foo fc -l +
        1 fooのローカル履歴をエコーし​​ます
        3 cd ../bar
    〜/ foo [ALT-h]                                           
    〜/ foo fc -l                                                          
       55ソースsrc / cd_history
       64 echoグローバル履歴
       65 mkdir fooバー
       66 cd foo
       70ローカルヒストリーをバーにエコー
       72 cd ../foo
       73 fooのローカル履歴をエコーする
       74 cd ../bar
    〜/ foo  
  • スクリプト(含まれる~/.zshrcか、ソースされる)

    # set options for shared history
    setopt prompt_subst
    setopt share_history
    setopt hist_ignorealldups
    
    # define right prompt as an indicator if local (i.e. per directory) history is enabled
    RPS1=' ${HISTLOC}'
    export HISTLOC=''
    
    # configure global history file and global/local history size
    export HISTGLOBAL=$HOME/.zsh_history
    touch $HISTGLOBAL
    export HISTSIZE=2000
    export SAVEHIST=2000
    
    # define wrapper function and key binding to switch between globel and per-dir history
    function my-local-history()
    {
      if [[ -z $HISTLOC ]]; then
        HISTLOC='+'
        chpwd
      else
        HISTLOC=''
        export HISTFILE=$HISTGLOBAL
        fc -A $HISTFILE
        fc -p $HISTFILE $HISTSIZE $SAVEHIST
      fi
      zle reset-prompt
    }
    zle -N my-local-history
    bindkey "^[h"    my-local-history
    
    # install hook function which is called upon every directory change
    chpwd () {
      if [[ ! -z $HISTLOC ]]; then
        fc -A $HISTGLOBAL $HISTSIZE $SAVEHIST
        export HISTFILE=$PWD/.zsh_history
        fc -p $HISTFILE $HISTSIZE $SAVEHIST
        touch $HISTFILE
      fi 
    }

バリアント2

もう一度考え直してみると、ディレクトリごとの履歴はきめ細かすぎるため、質問本文でプロジェクトごとの履歴を詳しく説明しているようです。そこで、プロジェクトを切り替えるワークオン機能を備えた別のバリアントを思いつきました。すべてのプロジェクトには、独自の履歴ファイルがあります~/.zsh_projhistory_[name]

  • デモンストレーション

    〜ソースsrc / proj_history 
    〜グローバル履歴をエコーする                                                                    
    世界史
    〜[ALT-h]                                                               [workonを使用]
    〜workon foo [workonを使用]
    〜プロジェクトfoo [on proj foo]のechoコマンド
    プロジェクトfooのコマンド
    〜fc -l [proj foo]
        プロジェクトfooの1つのechoコマンド
    〜ワークオンバー[proj foo]
    〜bar [on proj bar]という名前の別のプロジェクトをエコーし​​ます。
    barという名前の別のプロジェクト
    〜fc -l [プロジェクトバー]
        1 barという名前の別のプロジェクトをエコーし​​ます
    〜workon foo [プロジェクトバー]
    〜fc -l [proj foo]
        プロジェクトfooの1つのechoコマンド
        3ワークオンバー
    〜[ALT-h]                                                              [proj foo]
    〜
    〜fc -l                                                                                   
       31エコーグローバルヒストリー
       36 barという名前の別のプロジェクトをエコーし​​ます
       38 workon foo
       39プロジェクトfooのechoコマンド
       40ワークオンバー
    〜ls -1 .zsh_ *
    .zsh_history
    .zsh_projhistory_bar
    .zsh_projhistory_foo
  • スクリプト(含まれる~/.zshrcか、ソースされる)

    # set options for shared history
    setopt prompt_subst
    setopt share_history
    setopt hist_ignorealldups
    
    # define right prompt as an indicator if local (i.e. per directory) history is enabled
    RPS1=' ${HISTLOC}'
    export HISTLOC=''
    
    # configure global history file and global/local history size
    export HISTGLOBAL=$HOME/.zsh_history
    touch $HISTGLOBAL
    export HISTFILE=$HISTGLOBAL
    export HISTSIZE=2000
    export SAVEHIST=2000
    
    # define wrapper function and key binding to switch between globel and per-dir history
    function my-local-history()
    {
      if [[ -z $HISTLOC ]]; then
        if [[ -z $HISTLOC ]]; then
          HISTLOC='+'
          [[ -z "$HISTPROJ" ]] && HISTLOC='[use workon]' || workon "$HISTPROJ"
        fi
      else
        HISTLOC=''
        export HISTFILE=$HISTGLOBAL
        fc -A $HISTFILE
        fc -p $HISTFILE $HISTSIZE $SAVEHIST
      fi
      zle reset-prompt
    }
    zle -N my-local-history
    bindkey "^[h"    my-local-history
    
    # function to change project
    workon () {
      if [[ -z "$1" ]]; then
        echo Usage: workon [project name]
        return 1
      fi
      export HISTPROJ="$1"
      if [[ ! -z $HISTLOC ]]; then
        fc -A $HISTGLOBAL $HISTSIZE $SAVEHIST
        export HISTFILE=$HOME/.zsh_projhistory_"$HISTPROJ"
        fc -p "$HISTFILE" $HISTSIZE $SAVEHIST
        touch "$HISTFILE"
        HISTLOC="[on proj $HISTPROJ]"
      fi 
    }

0

ある地域でしばらく働いた後。

履歴> hist1.txtその後の履歴> hist2.txt

時々、ファイル名に日付を使用します。履歴> hist20180727.txt

この方法では、各ディレクトリの最近のコマンド履歴があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.