セットディレクトリ内のプロジェクトで多くの作業を行っていることがわかりました。時々—数ヶ月後—そのプロジェクトで何かをやり直す必要がありますが、何をしたのか思い出せません。 Mercurialまたはgitを使用してfilesへの変更を追跡していますが、そのディレクトリで発行したコマンドを覚えておきたいです。
私のシェルの履歴を検索することはあまり有益ではありません。すでにすべてを。* _ historyファイルに記録していますが、〜/ foo/barで行ったことのリストが必要であり、その週に行った他のすべての(百万)ことではありません。その特定のプロジェクトに最後に取り組んだ月を思い出せないかもしれません。
私が使用したすべてのシェルコマンドのプロジェクトディレクトリログファイルについて誰かが何か考えを持っていますか?私は次のようなコマンドを想定しています。
workon myproject
...これにより、シェルログファイルが〜/ myproject/.history.logに設定され、そのログファイルから以前の履歴が読み込まれ、プロンプトを更新して、作業中のディレクトリを教えてくれます(たとえば、バージョンを提供するvcpromptなど)管理情報)。
このようなものはありますか?
これをまだ理解していない場合:あなたが探しているのは優れた 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
変数が毎回別のプロジェクトに展開されることを意味します。
私もこれが必要で、 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
製品のサブパッケージを構築するフレームワークに使用する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
変数をオーバーライドする必要があると思います。しかし、それは似ているように見えます。
チャオ!
ディレクトリのローカル履歴ファイルを取得するために、bashプロンプトコマンドに次の行を追加しました。
if [ -f .local_history ] ; then tail -1 $HISTFILE >> .local_history ; fi
コマンド - touch .local_history
ディレクトリ内では、メインの履歴ファイルを失うことなく、そのディレクトリで実行されたすべてのコマンドのローカル履歴ファイルが表示されます。同様のことがzshでも機能すると思います。
Zsh用のdirectory-historyというプラグインに興味があるかもしれません。
こちらをご覧ください: https://github.com/tymm/directory-history
workon myprojectワークフローには実際には適合しませんが、ニーズに完全に適合するはずです。
ディレクトリを含む履歴を作成します。
履歴を検索すると、最初に現在のディレクトリからコマンドを取得します。
そのディレクトリにコマンドが残っていない場合は、グローバル履歴にフォールバックし、他のディレクトリで使用されているコマンドを提案します。
シンプルなものが必要な場合は、.history.log
ファイル自体:
#!/bin/cat
some
relevant
commands
次に、ファイルを実行すると、ファイルにリストしたコマンドがcat
されます。
慣例として、機能ごとにこれらのコマンドを個別のファイルにグループ化することもできます。
.howto.datadump
.howto.restart
これには、箱から出して作業し、環境を汚染しないという追加の利点があります。
私のロギングスクリプトを見てください ここ 。それらの1つを使用すると、各コマンドを発行するときに、現在のディレクトリを追跡できます。コマンドまたはその他の情報のログファイルをgrep
できます。私は自宅や職場でロングバージョンを使用しています。
少なくともbashでは、HISTFILEはシェルインスタンスの開始時にのみ参照されます。上記の「workon」の例でシェルインスタンスを作成しない限り、ディレクトリごとのアイデアはここでは機能しません。
多分あなたは次のようなものを見ることができます
alias workon='script ./.history.log'
ただし、スクリプトはサブシェルも作成します。
つまり、これを機能させるには、おそらく厄介なレベルのサブシェルが必要になります。
しばらくある地域で働いた後。
履歴> hist1.txtその後の履歴> hist2.txt
ファイル名に日付を使用することがあります。履歴> hist20180727.txt
このようにして、各ディレクトリの最近のコマンド履歴があります。
私は、さまざまな機能のために新しいユーザーとグループを作成するだけのプロダクションソフトウェアハウスで働いてきました。新しいユーザーは、グループメンバーシップと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.
ここでは2つのバリアントを示しますが、適用できるのはZ Shellのみです。
これは、あなたの質問のタイトルを読んだときに私が最初に考えたものです。このバリアントを使用すると、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
}
もう一度考えてみると、ディレクトリごとの履歴はきめ細かく、プロジェクトごとの履歴を質問の本文で詳しく説明しているようです。そこで、プロジェクトを切り替えるための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
}