प्रति-निर्देशिका बैश / zsh इतिहास लॉग फ़ाइलें


14

मुझे लगता है कि मैं एक प्रोजेक्ट पर एक सेट डायरेक्टरी में बहुत काम करता हूं। कभी-कभी ट्रैक से कुछ महीने नीचे - मुझे उस प्रोजेक्ट पर कुछ नया करने की आवश्यकता है लेकिन मुझे याद नहीं है कि मैंने क्या किया। मैं फ़ाइलों में परिवर्तन को ट्रैक करने के लिए मर्क्यूरियल या गिट का उपयोग करता हूं, लेकिन मैं यह याद रखना चाहता हूं कि मैंने उस निर्देशिका में क्या आदेश जारी किए हैं।

मेरे शेल इतिहास के माध्यम से खोज करना बहुत जानकारीपूर्ण नहीं है। मैं पहले से ही अपना सब कुछ लॉग इन करता हूं। * _ इतिहास की फाइलें, लेकिन मैं उन चीजों की एक सूची चाहता हूं जो मैंने ~ / foo / बार में की थीं, और अन्य सभी (मिलियन) चीजों को नहीं जो मैंने उस सप्ताह किया था। मुझे शायद यह भी याद नहीं है कि मैंने उस महीने किस प्रोजेक्ट पर काम किया था।

किसी को भी किसी भी विचार है कि कैसे एक परियोजना निर्देशिका लॉग फ़ाइल के सभी शेल कमांड का मैंने उपयोग किया है? मैं एक कमांड की कल्पना कर रहा हूँ जैसे:

वर्कऑन मायप्रोजेक्ट

... जो शेल लॉग फ़ाइल को ~ / myproject / .history.log पर सेट करेगा, उस लॉगफ़ाइल से पिछले इतिहास को लोड करेगा, और हो सकता है कि मुझे यह बताने के लिए मेरे प्रॉम्प्ट को अपडेट करें कि मैं किस निर्देशिका पर काम कर रहा हूं (जैसे कि संस्करण प्रदान करने के लिए vcprompt नियंत्रण जानकारी)।

वहाँ इस तरह से कुछ भी है?

जवाबों:


4

मामले में आपने अभी तक यह पता नहीं लगाया है: आप जो खोज रहे हैं वह उत्कृष्ट वर्चुअनवॉपर पैकेज है। यह अजगर के वर्चुअन (गो फिगर) के आसपास एक आवरण है और, जबकि यह आमतौर पर अजगर के वातावरण के बारे में लेते समय संदर्भित किया जाता है, यह वास्तव में एक बहुत ही सामान्य उपकरण है जो आपके उपयोग के मामले को संतुष्ट करता है।

स्थापना

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

मुझे भी इसकी आवश्यकता है और मैं एक ऐसे संस्करण के साथ आया हूं जो बैश के PROMPT_COMMAND चर का उपयोग करता है :

परिवर्तन के मूल्य PROMPT_COMMAND को बैश प्रिंट से पहले प्रत्येक प्राथमिक संकेत की जांच की जाती है। यदि PROMPT_COMMAND को सेट किया गया है और उसका गैर-शून्य मान है, तो मान को उसी तरह निष्पादित किया जाता है जैसे कि उसे कमांड लाइन पर टाइप किया गया था।

तो मैं कहता हूं कि PROMPT_COMMAND = "check_for_local_history" में ~ / .bashrc.my, जहां check_for_local_historyमेरा कार्य है जो यह जांचता है कि अगर अंतिम निष्पादित कमांड एक निर्देशिका परिवर्तन थी, और जब यह सच है, तो यह .bash_history फ़ाइल के लिए नई वर्तमान निर्देशिका की जांच करता है। । यदि यह वहां है, तो इसे इतिहास फ़ाइल के रूप में उपयोग करें।

यहाँ पूरी जानकारी है: https://gist.github.com/gurdiga/dac8d2e7eb3056d6b839


2

एक उत्पाद के लिए उप-पैकेज बनाने के ढांचे के लिए मैं एक चाल का उपयोग करता हूं, एक उप-खोल का उपयोग करना है।

बैश के लिए आप इस तरह से एक शेल स्क्रिप्ट बना सकते हैं:

#!/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मुझे लगता है कि आपको वेरिएबल को ओवरराइड करना होगा । लेकिन यह समान दिखेगी।

Ciao!


1

यहां मेरी लॉगिंग स्क्रिप्ट पर एक नज़र डालें । उनमें से किसी एक का उपयोग करके, आप प्रत्येक आदेश जारी करते समय आप किस निर्देशिका का ट्रैक रख सकते हैं। आप grepकमांड या अन्य जानकारी के लिए लॉग फाइल कर सकते हैं। मैं घर पर और काम पर लंबे संस्करण का उपयोग करता हूं।


धन्यवाद - मैं इस पर एक नज़र डालूंगा। मुझे जो कुछ चाहिए, उसके करीब हो सकता है!
साइमन

1

आपको एक प्लगइन में दिलचस्पी हो सकती है जिसे मैंने zsh के लिए डायरेक्टरी-हिस्ट्री कहा था ।
यहां देखें: https://github.com/tymm/directory-history

हालांकि यह वास्तव में आपके वर्कऑन मायप्रोजेक्ट वर्कफ़्लो को फिट नहीं करता है, यह आपकी आवश्यकताओं को पूरी तरह से फिट होना चाहिए।

यह एक इतिहास बनाता है जिसमें निर्देशिकाएं शामिल हैं।
जब आप अपने इतिहास के माध्यम से खोज करते हैं, तो आप पहली बार उस निर्देशिका से कमांड प्राप्त करेंगे, जिसमें आप हैं।
यदि उस निर्देशिका के लिए कोई कमांड नहीं बची है, तो यह एक वैश्विक इतिहास में वापस आ जाएगी और अन्य निर्देशिकाओं में उपयोग किए गए कमांड का सुझाव देगी।


1

यदि आप कुछ सरल चाहते हैं, तो आप अपनी .history.logफ़ाइल को इस तरह से देख सकते हैं :

#!/bin/cat
some
relevant
commands

फिर फ़ाइल चलाना catउन आदेशों को सूचीबद्ध करेगा जिन्हें आपने इसमें सूचीबद्ध किया है।
आप अधिवेशन के रूप में कार्यक्षमता द्वारा अलग-अलग फाइलों में उन कमांडों को भी समूहित कर सकते हैं:

.howto.datadump
.howto.restart

यह बॉक्स से बाहर काम करने और आपके पर्यावरण को प्रदूषित न करने का अतिरिक्त लाभ है।


वैकल्पिक रूप से आप प्रति विषय README.mdअन्य .mdफ़ाइलों का उपयोग कर सकते हैं या बना सकते हैं और उन्हें रीडमी से इंगित कर सकते हैं। अगर आपके पास मार्कडाउन फ्रेंडली सोर्स कंट्रोल इंटरफेस है।
रेनो

1

एक निर्देशिका के लिए एक स्थानीय इतिहास फ़ाइल प्राप्त करने के लिए मैंने निम्नलिखित लाइन को अपने बैश प्रॉम्प्ट कमांड में जोड़ा।

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

touch .local_historyएक डायरेक्टरी में कमांड मुझे मुख्य हिस्ट्री फाइल को खोले बिना, उस डायरेक्टरी में निष्पादित सभी कमांड्स के लिए एक स्थानीय हिस्ट्री फाइल देता है। कुछ इसी तरह मैं zsh में काम करेगा मुझे लगता है।


0

कम से कम bash में, HISTFILE को केवल शेल इंस्टेंस की शुरुआत में परामर्श दिया जाता है। प्रति-dir विचार यहां काम नहीं करेगा, जब तक कि आपके 'वर्कऑन' उदाहरण ऊपर एक शेल उदाहरण नहीं बनाते हैं।

शायद आप कुछ इस तरह से देख सकते हैं

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

लेकिन स्क्रिप्ट भी एक उपधारा बनाता है।

संक्षेप में, आपको इसे काम करने के लिए संभवतः उप-स्तरों के गड़बड़ स्तरों की आवश्यकता होगी।


अरे, मैं उम्मीद कर रहा था कि यह कुछ सरल होगा। फिर भी धन्यवाद!
साइमन

0

मैंने प्रोडक्शन सॉफ्टवेयर हाउस में काम किया है जहाँ हम विभिन्न कार्यों के लिए नए उपयोगकर्ता और समूह बनायेंगे। विशेष रूप से कॉन्फ़िगरेशन प्रबंधन या सॉफ़्टवेयर के लिए नए उपयोगकर्ता खाते समूह सदस्यता और एसीएल के माध्यम से अन्य संबंधित कार्यात्मक क्षेत्रों में दृश्यता के विभिन्न स्तरों के साथ बनाते हैं, और कमांड इतिहास जो कहते हैं कि प्रदर्शन किया जाता है, cmmgrमें सहेजा जाएगा ~cmmgr/.bash_history, bldmgrसंबंधित शब्द ~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

यहां मैं दो वेरिएंट पेश करता हूं, लेकिन केवल Z Shell पर लागू होता है ।

भिन्न 1

आपके प्रश्न शीर्षक को पढ़ते समय मैंने यही सोचा था। इस संस्करण के साथ आप ALT+ h: वैश्विक या स्थानीय दो इतिहास मोड के बीच स्विच कर सकते हैं , जहां बाद वाले प्रति-निर्देशिका इतिहास में स्वचालित रूप से chirir पर स्विच करते हैं । वैश्विक इतिहास सभी जारी किए गए आदेशों को जमा करता है

  • प्रदर्शन

    ~ स्रोत src / cd_history
    ~ गूंज वैश्विक इतिहास                                                
    वैश्विक इतिहास
    ~ मकिर फू बार                                                      
    ~ [ALT-h] 
    ~                          स्थानीय इतिहास के लिए संकेतक पर ध्यान दें ->    +
    ~ cd फू +
    ~ / foo echo स्थानीय इतिहास foo + में
    फू में स्थानीय इतिहास
    ~ / फू fc -l +
        1 फू में स्थानीय इतिहास गूंज
    ~ / फू cd ../bar +
    ~ / बार गूंज स्थानीय इतिहास बार + में
    बार में स्थानीय इतिहास
    ~ / बार fc -l +
        1 बार में स्थानीय इतिहास गूंज
    ~ / बार cd ../foo +
    ~ / फू fc -l +
        1 फू में स्थानीय इतिहास गूंज
        3 सीडी ../bar
    ~ / फू [ALT-h]                                           
    ~ / फू fc -l                                                          
       55 स्रोत src / cd_history
       64 गूंज वैश्विक इतिहास
       65 mkdir फू बार
       66 सीडी फू
       बार में 70 इको स्थानीय इतिहास
       72 cd ../foo
       फू में 73 इको स्थानीय इतिहास
       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]                                                               [कार्य का उपयोग करें]
    ~ वर्कऑन फू [उपयोग वर्कॉन]
    ~ इको कमांड इन प्रोजेक्ट फू [प्रोज फू पर]
    प्रोजेक्ट फू में कमांड
    ~ एफसी -एल [प्रोज फू पर]
        प्रोजेक्ट फू में 1 इको कमांड
    ~ वर्कन बार [प्रोज फू पर]
    ~ गूंज एक और प्रोज, जिसका नाम बार है [प्रोज बार पर]
    एक और प्रोज, जिसका नाम बार है
    ~ एफसी -एल [प्रोज बार पर]
        1 प्रतिध्वनि एक और प्रोज, जिसका नाम बार है
    ~ वर्कोन फू [प्रोज बार पर]
    ~ एफसी -एल [प्रोज फू पर]
        प्रोजेक्ट फू में 1 इको कमांड
        3 कार्य पट्टी
    ~ [ALT-h]                                                              [प्रोज फू पर]
    ~
    ~ एफसी -एल                                                                                   
       31 इको वैश्विक इतिहास
       36 प्रतिध्वनि एक और प्रोज, जिसका नाम बार है
       38 वर्कऑन फू
       प्रोजेक्ट फू में 39 इको कमांड
       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

इस तरह से प्रत्येक डायरेक्टरी के लिए हालिया कमांड हिस्ट्री है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.