web-dev-qa-db-ja.com

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

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

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

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

workon myproject

...これにより、シェルログファイルが〜/ myproject/.history.logに設定され、そのログファイルから以前の履歴が読み込まれ、プロンプトを更新して、作業中のディレクトリを教えてくれます(たとえば、バージョンを提供するvcpromptなど)管理情報)。

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

14
Simon

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

Installation

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変数が毎回別のプロジェクトに展開されることを意味します。

4

私もこれが必要で、 BashのPrompt_COMMAND変数 を使用するバージョンを考え出しました。

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

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

完全な要点は次のとおりです: https://Gist.github.com/gurdiga/dac8d2e7eb3056d6b839

3
Vlad GURDIGA

製品のサブパッケージを構築するフレームワークに使用する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ファイルのプロンプトをカスタマイズすることもできます。これは便利です。

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

チャオ!

2
docwhat

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

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

コマンド - touch .local_historyディレクトリ内では、メインの履歴ファイルを失うことなく、そのディレクトリで実行されたすべてのコマンドのローカル履歴ファイルが表示されます。同様のことがzshでも機能すると思います。

1
Aad Schippers

Zsh用のdirectory-historyというプラグインに興味があるかもしれません。
こちらをご覧ください: https://github.com/tymm/directory-history

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

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

1
tymm

シンプルなものが必要な場合は、.history.logファイル自体:

#!/bin/cat
some
relevant
commands

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

.howto.datadump
.howto.restart

これには、箱から出して作業し、環境を汚染しないという追加の利点があります。

1
Reno

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

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

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

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

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

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

0
Rich Homolka

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

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

ファイル名に日付を使用することがあります。履歴> hist20180727.txt

このようにして、各ディレクトリの最近のコマンド履歴があります。

0
John

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

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

ここでは2つのバリアントを示しますが、適用できるのはZ Shellのみです。

バリアント1

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

  • デモンストレーション

    〜source src/cd_history 
     〜echo global history 
     global history 
     〜mkdir foo bar 
    〜 [ALT-h]
    〜 ローカル履歴のインジケータに注意してください->   + 
     〜cd foo + 
    〜/ foo echo local history in foo + 
     local history in foo 
    〜/ foo fc -l + 
     1 foo 
    〜/ foo cd ../bar + 
    〜/ barのエコーローカル履歴バー+ 
    バーのローカル履歴
    〜/ bar fc -l + 
     bar 
    〜/ bar cd ../foo + 
    〜/ foo fc -l + 
    の1エコーローカル履歴fooの履歴
     3 cd ../bar 
    〜/ foo [ALT-h]                                           
    〜/ foo fc -l 
     55 source src/cd_history 
     64 echo global history 
     65 mkdir foo bar 
     66 cd foo 
     70バーのエコーローカル履歴
     72 cd../foo
    73fooのエコーローカル履歴
     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

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

  • デモンストレーション

    〜source src/proj_history 
    〜エコーグローバル履歴
    グローバル履歴
    〜 [ALT-h]                                                              [use workon] 
     〜workon foo [use workon] 
    〜プロジェクトfooのechoコマンド[on proj foo] 
    プロジェクトfooのコマンド
     〜fc -l [on proj foo] 
    プロジェクトfoo 
    の1つのechoコマンド〜workon bar [on proj foo] 
     〜bar [on proj bar] [.____という名前の別のプロジェクトをエコーし​​ます。 ] bar 
     〜fc -l [プロジェクトバー] 
    という名前の別のプロジェクト1は、bar 
     〜workon foo [プロジェクトバー上] 
    という名前の別のプロジェクトをエコーし​​ます。 〜fc -l [on proj foo] 
    プロジェクトfoo 
    の1つのechoコマンド3つのworkonbar 
    〜 [ALT-h]                                                             [on proj foo] 
    〜
     〜fc -l 
     31 echo global history 
     36 echo bar 
    という名前の別のプロジェクト38workon foo 
     39プロジェクトfoo 
    のechoコマンド40workon bar 
     〜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
mpy