ไฟล์บันทึกประวัติ bash / zsh ต่อไดเรกทอรี


14

ฉันพบว่าฉันทำงานหลายอย่างในโครงการในไดเรกทอรีชุด บางครั้งฉันก็ต้องทำซ้ำบางอย่างในโครงการนั้น แต่ฉันจำไม่ได้ว่าทำอะไร ฉันใช้ Mercurial หรือ Git เพื่อติดตามการเปลี่ยนแปลงของไฟล์แต่ฉันต้องการที่จะจำคำสั่งที่ฉันใช้ในไดเรกทอรีนั้น

การค้นหาประวัติเชลล์ของฉันไม่ค่อยมีประโยชน์ ฉันบันทึกทุกอย่างไว้ในไฟล์ประวัติ * _ แล้ว แต่ฉันต้องการรายการสิ่งที่ฉันทำใน ~ / foo / bar และไม่ใช่สิ่งอื่น ๆ (ล้าน) ที่ฉันทำในสัปดาห์นั้น ฉันอาจจำไม่ได้ว่าเดือนใดที่ฉันทำงานในโปรเจ็กต์นั้น

ใครบ้างมีความคิดใด ๆ วิธีล็อกไฟล์ไดเรกทอรีโครงการของคำสั่งเชลล์ทั้งหมดที่ฉันใช้? ฉันนึกภาพออกคำสั่งเช่น:

ทำงานโครงการของฉัน

... ซึ่งจะตั้งค่าล็อกไฟล์เชลล์เป็น ~ / myproject / .history.log โหลดประวัติก่อนหน้าจากล็อกไฟล์นั้นและอาจอัปเดตพรอมต์ของฉันเพื่อบอกฉันว่าไดเรกทอรีใดที่ฉันใช้งานอยู่ (เช่น vcprompt เพื่อให้รุ่น ข้อมูลการควบคุม)

มีอะไรแบบนี้มั้ย

คำตอบ:


4

ในกรณีที่คุณยังไม่เข้าใจสิ่งนี้: สิ่งที่คุณกำลังมองหาคือแพ็คเกจvirtualenvwrapper ที่ยอดเยี่ยม มันเป็นเสื้อคลุมรอบvirtualenvของ python (ไปรูป) และในขณะที่มันถูกอ้างถึงโดยทั่วไปเมื่อใช้เกี่ยวกับสภาพแวดล้อมที่หลามมันเป็นเครื่องมือที่ใช้กันทั่วไปมากที่ตอบสนองการใช้งานของคุณ

การติดตั้ง

pip install virtualenvwrapper

หรือ

easy_install virtualenvwrapper

และเพิ่มข้อมูลการเริ่มต้นลงใน shell config ของคุณ ( ~/.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 ของ Bash :

ค่าของตัวแปร PROMPT_COMMAND จะถูกตรวจสอบก่อนที่ Bash จะพิมพ์พรอมต์หลักแต่ละรายการ หาก PROMPT_COMMAND ถูกตั้งค่าและมีค่าที่ไม่ใช่ค่า Null ค่านั้นจะถูกดำเนินการเช่นเดียวกับที่พิมพ์บนบรรทัดคำสั่ง

ดังนั้นฉันจึงพูดว่า PROMPT_COMMAND = "check_for_local_history" ใน ~ / .bashrc.my ซึ่งcheck_for_local_historyเป็นหน้าที่ของฉันที่จะตรวจสอบว่าคำสั่งที่ดำเนินการครั้งล่าสุดเป็นการเปลี่ยนไดเรกทอรีและเมื่อเป็นจริงมันจะตรวจสอบไดเรกทอรีปัจจุบันใหม่สำหรับไฟล์. bash_history . หากมีให้ใช้เป็นไฟล์ประวัติ

นี่คือส่วนสำคัญทั้งหมด: https://gist.github.com/gurdiga/dac8d2e7eb3056d6b839


2

เคล็ดลับหนึ่งที่ฉันใช้สำหรับกรอบการสร้างแพ็คเกจย่อยสำหรับผลิตภัณฑ์คือการใช้เชลล์ย่อย

สำหรับ 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ฉันคิดว่าคุณต้องแทนที่ตัวแปร แต่มันก็ดูคล้ายกัน

Ciao!


1

ลองดูที่สคริปต์การเข้าสู่ระบบของฉันที่นี่ เมื่อใช้หนึ่งในนั้นคุณสามารถติดตามว่าคุณอยู่ในไดเรกทอรีใดเมื่อคุณออกคำสั่งแต่ละคำสั่ง คุณสามารถgrepล็อกไฟล์สำหรับคำสั่งหรือข้อมูลอื่น ๆ ฉันใช้เวอร์ชั่นยาวทั้งที่บ้านและที่ทำงาน


ขอบคุณ - ฉันจะดูสิ่งนี้ อาจทำบางสิ่งบางอย่างใกล้เคียงกับสิ่งที่ฉันต้องการ!
Simon

1

คุณอาจสนใจปลั๊กอินที่ฉันเขียนไว้ว่าdirectory-historyสำหรับ 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 นั่นคือถ้าคุณมีอินเทอร์เฟซการควบคุมมาร์กอัปที่เป็นมิตร
Reno

1

หากต้องการรับไฟล์ประวัติโลคัลสำหรับไดเร็กทอรีฉันเพิ่มบรรทัดต่อไปนี้ในคำสั่ง bash prompt ของฉัน

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

คำสั่งtouch .local_historyในไดเรกทอรีจะให้แฟ้มประวัติภายในเครื่องแก่ฉันสำหรับคำสั่งทั้งหมดที่ดำเนินการในไดเรกทอรีนั้นโดยไม่สูญเสียไฟล์ประวัติหลัก สิ่งที่คล้ายกันจะทำงานใน zsh ฉันเดา


0

ใน bash อย่างน้อย HISTFILE จะได้รับการพิจารณาเมื่อเริ่มต้นอินสแตนซ์ของเชลล์เท่านั้น แนวคิดต่อผู้ใช้จะไม่ทำงานที่นี่เว้นแต่ว่าตัวอย่าง 'เวิร์ค' ของคุณด้านบนจะสร้างเชลล์อินสแตนซ์

บางทีคุณอาจมองอะไรบางอย่าง

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

แต่สคริปต์ก็สร้างเชลล์ย่อยด้วย

ในระยะสั้นคุณอาจต้องใช้ subshells ระดับยุ่ง ๆ เพื่อให้มันทำงานได้


ประณามฉันหวังว่ามันจะเป็นอะไรที่ง่าย ขอขอบคุณ!
Simon

0

ฉันทำงานในบ้านผลิตซอฟต์แวร์ที่เราเพิ่งสร้างผู้ใช้และกลุ่มใหม่สำหรับฟังก์ชั่นต่าง ๆ บัญชีผู้ใช้ใหม่โดยเฉพาะสำหรับการจัดการการกำหนดค่าหรือซอฟต์แวร์สร้างที่แตกต่างกับระดับของการมองเห็นในที่เกี่ยวข้องอื่น ๆพื้นที่การทำงานผ่านทางสมาชิกกลุ่มและ ACL และประวัติคำสั่งที่ดำเนินการโดยพูดcmmgrจะถูกบันทึกไว้ใน~cmmgr/.bash_history, bldmgrคำที่เกี่ยวข้องจะได้รับการบันทึกไว้ใน~bldmgr/.bash_historyฯลฯ แต่น่าเสียดายที่ เพื่อเข้าสู่ระบบผู้ใช้จะต้องเป็นเจ้าของไดเรกทอรีเข้าสู่ระบบของพวกเขา ดังนั้นจึงมีการตั้งค่าพื้นที่โปรเจ็กต์บนดิสก์แยกกันโดยสิ้นเชิง ความเป็นเจ้าของผู้สร้างไฟล์แสดงให้เห็นว่าพื้นที่ทำงานใดที่สร้างไฟล์ในพื้นที่โครงการซึ่ง.bash_historyอาจมีการตรวจสอบความเหมาะสม

อย่างไรก็ตามวิธีการข้างต้นไม่ได้ให้ความสำคัญกับสิ่งที่คุณต้องการ แต่มันให้โครงกระดูกที่เมื่อรวมกับการเป็นสมาชิกกลุ่มผู้ใช้สามารถสลับกลุ่มnewgrpที่สร้างเชลล์และสภาพแวดล้อมใหม่ได้อย่างมีประสิทธิภาพจากนั้นใช้ ของวิธีการที่ให้ไว้ในคำตอบอื่น ๆ เพื่อแก้ไข~/.bash_historyไฟล์ที่มีประสิทธิภาพเมื่อสลับหมวกเพื่อพูดcmmgrเพื่อให้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

นี่ผมนำเสนอสองสายพันธุ์ แต่ที่ใช้บังคับเฉพาะกับZ เชลล์

ตัวแปร 1

นี่คือสิ่งที่ฉันคิดว่าเมื่ออ่านชื่อคำถามของคุณ ด้วยความแตกต่างนี้คุณสามารถสลับไปมาระหว่างสองโหมดประวัติศาสตร์ที่มีALT+ h: ทั่วโลกหรือท้องถิ่นที่สวิทช์หลังมีประวัติต่อไดเรกทอรีโดยอัตโนมัติเมื่อ chdir ประวัติทั่วโลกสะสมคำสั่งที่ออกทั้งหมด

  • สาธิต

    ~ source src / cd_history
    ~ สะท้อนประวัติศาสตร์โลก                                                
    ประวัติศาสตร์ระดับโลก
    ~ mkdir foo bar                                                      
    ~ [ALT-h] 
    ~                          หมายเหตุตัวบ่งชี้สำหรับประวัติท้องถิ่น ->    +
    ~ cd foo +
    ~ / foo echo ประวัติศาสตร์ท้องถิ่นใน foo +
    ประวัติศาสตร์ท้องถิ่นใน foo
    ~ / foo fc -l +
        1 สะท้อนประวัติศาสตร์ท้องถิ่นใน foo
    ~ / foo cd ../bar +
    ~ / bar echo history local ใน 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 สะท้อนประวัติศาสตร์โลก
       65 mkdir foo bar
       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

เมื่อคิดถึงมันอีกครั้งดูเหมือนว่าประวัติต่อผู้ใช้นั้นเล็กเกินไปและคุณยังอธิบายประวัติต่อโครงการเพิ่มเติมในเนื้อหาคำถามของคุณ ดังนั้นฉันจึงสร้างตัวแปรขึ้นมาใหม่พร้อมฟังก์ชันworkonเพื่อสลับระหว่างโครงการ ~/.zsh_projhistory_[name]โครงการทุกคนมีแฟ้มประวัติของตัวเอง

  • สาธิต

    ~ source src / proj_history 
    ~ สะท้อนประวัติศาสตร์โลก                                                                    
    ประวัติศาสตร์ระดับโลก
    ~ [ALT-h]                                                               [use workon]
    ~ workon foo [ใช้ workon]
    คำสั่ง ~ echo ในโปรเจ็กต์ foo [บน proj foo]
    คำสั่งในโครงการ foo
    ~ fc -l [บน proj foo]
        1 คำสั่ง echo ในโครงการ foo
    ~ workon bar [ใน proj foo]
    ~ echo อีก proj ชื่อบาร์ [บน proj บาร์]
    อีกโครงการบาร์ชื่อ
    ~ fc -l [บนโปรเจคบาร์]
        1 สะท้อนอีกโพรเซส, บาร์ชื่อ
    ~ workon foo [บนโปรเจคบาร์]
    ~ fc -l [บน proj foo]
        1 คำสั่ง echo ในโครงการ foo
        3 workon bar
    ~ [ALT-h]                                                              [บน proj foo]
    ~
    ~ fc -l                                                                                   
       31 สะท้อนประวัติศาสตร์โลก
       36 สะท้อนอีกโครงการที่มีชื่อว่าบาร์
       38 workon foo
       39 คำสั่ง echo ในโครงการ foo
       40 workon 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

หลังจากทำงานในพื้นที่เดียวชั่วขณะหนึ่ง

ประวัติ> hist1.txt จากนั้นประวัติในภายหลัง> hist2.txt

บางครั้งฉันใช้วันที่สำหรับชื่อไฟล์ ประวัติ> hist20180727.txt

วิธีนี้มีประวัติคำสั่งล่าสุดสำหรับแต่ละไดเรกทอรี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.