Dizin başına bash / zsh geçmiş günlük dosyaları


14

Set dizinindeki bir proje üzerinde çok çalıştığımı fark ettim. Bazen - pistten birkaç ay sonra - o projede bir şeyleri yeniden yapmam gerekiyor ama ne yaptığımı hatırlayamıyorum. Dosyalardaki değişiklikleri izlemek için mercurial veya git kullanıyorum, ancak bu dizinde hangi komutları verdiğimi hatırlamak istiyorum.

Kabuk geçmişimde arama yapmak çok bilgilendirici değil. Her şeyi zaten. * _ Geçmiş dosyalarıma kaydediyorum, ancak ~ / foo / bar'da yaptığım şeylerin bir listesini istiyorum ve o hafta yaptığım diğer tüm (milyon) şeylerin değil. O projede en son hangi ay çalıştığımı hatırlamıyorum bile.

Herkes benim kullandığım kabuk komutlarının bir proje dizin günlük dosyası nasıl bir fikir var mı? Bir komutu şöyle öngörüyorum:

projemde çalışma

... kabuk günlük dosyasını ~ / myproject / .history.log olarak ayarlayacak, önceki geçmişi bu günlük dosyasından yükleyecek ve hangi dizin üzerinde çalıştığımı söylemek için istemimi güncelleyebilir (örneğin, sürümü sağlamak için vcprompt gibi) kontrol bilgisi).

Orada böyle bir şey var mı?

Yanıtlar:


4

Bunu henüz anlamadıysanız : aradığınız şey mükemmel bir sanalenvwrapper paketidir. Python'un virtualenv (go şekil) etrafında bir sarıcıdır ve python ortamları alırken yaygın olarak adlandırılırken, aslında kullanım durumunuzu tatmin eden çok genel bir araçtır.

Kurulum

pip install virtualenvwrapper

veya

easy_install virtualenvwrapper

ve kabuk yapılandırmanıza ( ~/.zshrc, ~/.bashrc) başlangıç ​​öğelerini ekleyin

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

kullanım

# 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

Ayrıca, ~/.virtualenvs/{postactivate,postdeactivate,etc}her seferinde denilen jenerik kancalara da sahipsiniz workon any_project.

Yani, örneğin, çizgi sahip export HISTFILE="$VIRTUAL_ENV/bash_history"içinde ~/virtualenvs/postactivatekanca araçlarının $HISTFILEdeğişken başka bir proje için her zaman genişletilecek.


3

Ben de buna ihtiyacım var ve Bash'ın PROMPT_COMMAND değişkenini kullanan bir sürüm ile geldim :

PROMPT_COMMAND değişkeninin değeri, Bash her birincil istemi yazdırmadan hemen önce incelenir. PROMPT_COMMAND ayarlanmışsa ve null olmayan bir değere sahipse, değer tıpkı komut satırına yazılmış gibi yürütülür.

Bu yüzden, ~ / .bashrc.my dosyasında PROMPT_COMMAND = "check_for_local_history" diyorum, check_for_local_historyson çalıştırılan komutun bir dizin değişikliği olup olmadığını kontrol eden benim bir işlevim ve bu doğru olduğunda, yeni geçerli dizini .bash_history dosyası için kontrol eder . Oradaysa, geçmiş dosyası olarak kullanın.

İşte tam bir öz: https://gist.github.com/gurdiga/dac8d2e7eb3056d6b839


2

Bir ürün için alt paket oluşturma çerçevesi için kullandığım bir numara, bir alt kabuk kullanmaktır.

Bash için şöyle bir kabuk betiği oluşturabilirsiniz:

#!/bin/bash

export PROJECT_DIRECTORY=$(pwd)

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

Sonra $HOME/.project-bashrcböyle bir şey koyuyorsun:

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

Bu aynı zamanda .project-bashrcdosyadaki istemi özelleştirmenizi sağlar , bu da kullanışlı olabilir.

Aynı şeyi nasıl yapacağımdan emin değilim zsh. ZDOTDIRBence değişkeni geçersiz kılmalısın . Ama benzer görünecektir.

Ciao!


1

Buradaki günlük dosyalarıma bir göz atın . Bunlardan birini kullanarak, her komutu verdiğinizde hangi dizinde bulunduğunuzu takip edebilirsiniz. grepKomut veya diğer bilgiler için günlük dosyasını yapabilirsiniz . Uzun versiyonu evde ve işte kullanıyorum.


Teşekkürler - Buna bir göz atacağım. İhtiyacım olana yakın bir şey yapabilir!
Simon

1

Zsh için dizin geçmişi adlı bir eklenti ilginizi çekebilir .
Buraya bakın: https://github.com/tymm/directory-history

Projem iş akışına gerçekten uymasa da , ihtiyaçlarınıza mükemmel bir şekilde uymalıdır.

Dizinleri içeren bir tarih oluşturur.
Geçmişinizde arama yaptığınızda, önce bulunduğunuz dizinden komutlar alırsınız.
Bu dizin için herhangi bir komut kalmazsa, global bir geçmişe geri döner ve diğer dizinlerde kullanılan komutları önerir.


1

Basit bir şey istiyorsanız, .history.logdosyanızı şu şekilde kullanabilirsiniz:

#!/bin/cat
some
relevant
commands

Daha sonra dosyayı çalıştırmak, catiçinde listelediğiniz komutları verir.
Bu komutları kural olarak işlevselliğe göre ayrı dosyalarda da gruplandırabilirsiniz:

.howto.datadump
.howto.restart

Bunun, kutunun dışında çalışma ve çevrenizi kirletmeme avantajı vardır.


Alternatif olarak, konu başına README.mdbaşka .mddosyaları kullanabilir veya başka dosyalar oluşturabilir ve bunları benioku dosyasından gösterebilirsiniz . Markdown dostu bir kaynak kontrol arayüzünüz varsa.
Reno

1

Bir dizinin yerel geçmiş dosyasını almak için bash istem komutuma aşağıdaki satırı ekledim.

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

touch .local_historyBir dizindeki komut daha sonra ana geçmiş dosyasını kaybetmeden o dizinde yürütülen tüm komutlar için bir yerel geçmiş dosyası verir. Sanırım zsh'da benzer bir şey işe yarayacaktı.


0

En azından bash, HISTFILE yalnızca kabuk örneğinin başlangıcında danışılır. Yukarıdaki "workon" örneğiniz bir kabuk örneği oluşturmadıkça, yönlendirme fikri burada çalışmaz.

Belki şöyle bir şeye bakabilirsin

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

Ancak script de bir alt kabuk oluşturur.

Kısacası, bunun işe yaraması için muhtemelen dağınık seviyelerde alt kabuklara ihtiyacınız olacak.


Kahretsin, bunun basit bir şey olacağını umuyordum. Yine de teşekkürler!
Simon

0

Çeşitli işlevler için yeni kullanıcılar ve gruplar oluşturacağımız üretim yazılım evlerinde çalıştım. Grup üyeliği ve ACL aracılığıyla diğer ilgili işlevsel alanlara değişen görünürlük düzeylerine sahip özel olarak yapılandırma yönetimi veya yazılım yapıları için yeni kullanıcı hesapları ve say ile gerçekleştirilen komut geçmişi cmmgrkaydedilecek ~cmmgr/.bash_history, bldmgrilgili sözcük kaydedilecektir ~bldmgr/.bash_history, vb. giriş yapmak için kullanıcının kendi giriş dizinine sahip olması gerekir. Bu nedenle, ayrı bir disk üzerinde tamamen bir proje alanı oluşturulmuştur. Dosya oluşturucunun mülkiyeti, hangi fonksiyonel alanın proje alanında dosyaları oluşturduğunu ve bunun için uygun .bash_historyolanların incelenebileceğini gösterdi.

Bununla birlikte, yukarıdaki yaklaşım size arzu ettiğiniz ayrıntı düzeyini vermez, ancak grup üyeliği ile birleştirildiğinde, bir kullanıcının newgrpetkili bir şekilde yeni bir kabuk ve çevre oluşturan grupları değiştirebileceği ve sonra bir diğer cevaplarda verilen yaklaşımlar, şapkaları söylerken etkili ~/.bash_historydosyayı değiştirmek için , böylece komut olarak yeni gruba giren ve çıkan bir klasör başına kullanılan ve kaydedilen bir yönetimi yönetebilir . Kontrol edin . Bu sorunun diğer cevaplarında bu satırlar boyunca bazı başlangıç ​​noktaları vardır. Bunlar UNIX grup paradigmasıyla çalışmalıdır - somun ve cıvataların çoğu, kabuk başlatma ve çıkış rutinleri tarafındancmmgrnewgrp~/.bash_historynewgrpman newgrpnewgrpçağırma. Çıkış 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

Burada iki varyant sunuyorum, ancak sadece Z Kabuğu için geçerli .

Değişke 1

Soru başlığınızı okurken ilk düşündüğüm şey bu. Bu varyant ile ALT+ h: Genel veya yerel olmak üzere iki geçmiş modu arasında geçiş yapabilirsiniz , ikincisi chdir'de otomatik olarak dizin başına bir geçmişe geçer . Küresel tarih, verilen tüm komutları biriktirir .

  • gösteri

    ~ kaynak src / cd_history
    ~ küresel tarih yankı                                                
    küresel tarih
    ~ mkdir foo bar                                                      
    ~ [ALT-h] 
    ~                          yerel tarih göstergesine dikkat edin ->    +
    ~ cd foo +
    ~ / foo yankı yerel tarih foo +
    foo yerel geçmişi
    ~ / foo fc -l +
        1 Foo yerel tarihi
    ~ / foo cd ../bar +
    ~ / bar bar + 'da yerel geçmişi yansıtır
    yerel tarih
    ~ / bar fc -l +
        Barda 1 yankı yerel geçmişi
    ~ / bar cd ../foo +
    ~ / foo fc -l +
        1 Foo yerel tarihi
        3 cd ../bar
    ~ / foo [ALT-h]                                           
    ~ / foo fc -l                                                          
       55 kaynak src / cd_history
       64 yankı küresel tarih
       65 mkdir foo bar
       66 cd foo
       Barda 70 yankı yerel tarihi
       72 cd ../foo
       73 Foo yerel tarihi yankı
       74 cd ../bar
    ~ / Deneme  
  • Komut dosyası ( ~/.zshrciçerilecek veya kaynaklanacak)

    # 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 
    }

Değişke 2

Tekrar düşünerek, kişi başına geçmişin çok ince taneli olduğu ve aynı zamanda soru bedeninizde daha fazla proje başına bir tarih tarif ettiğiniz görülüyor. Bu yüzden projeler arasında geçiş yapmak için çalışma fonksiyonu olan başka bir varyant buldum . Her projenin kendi geçmiş dosyası vardır ~/.zsh_projhistory_[name].

  • gösteri

    ~ kaynak src / proj_history 
    ~ küresel tarih yankı                                                                    
    küresel tarih
    ~ [ALT-h]                                                               [workon kullan]
    ~ workon foo [workon kullan]
    ~ project foo'da echo komutu [on proj foo]
    foo projesinde komut
    ~ fc -l [projektörde]
        Foo projesinde 1 yankı komutu
    ~ çalışma çubuğu [projektörde]
    ~ bar [projektör çubuğunda] adında başka bir projeyi yankılayın
    bar adlı başka bir proje
    ~ fc -l [projektör çubuğunda]
        1, başka bir projeyi yansıtıyor, bar adlı
    ~ workon foo [projektör çubuğunda]
    ~ fc -l [projektörde]
        Foo projesinde 1 yankı komutu
        3 çalışma çubuğu
    ~ [ALT-h]                                                              [projede]
    ~
    ~ fc -l                                                                                   
       31 Yankı Global Tarihi
       36 bar adında başka bir projeyi yansıtıyor
       38 çalışma foo
       39 foo projesinde yankı komutu
       40 çalışma çubuğu
    ~ ls -1 .zsh_ *
    .zsh_history
    .zsh_projhistory_bar
    .zsh_projhistory_foo
  • Komut dosyası ( ~/.zshrciçerilecek veya kaynaklanacak)

    # 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

Bir süre bir alanda çalıştıktan sonra.

geçmiş> hist1.txt ve daha sonra geçmiş> hist2.txt

Bazen dosya adı için tarih kullanıyorum. geçmiş> hist20180727.txt

Bu şekilde, her dizin için yakın zamanda bir komut geçmişi vardır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.