Tệp nhật ký lịch sử bash / zsh mỗi thư mục


14

Tôi thấy tôi làm rất nhiều công việc trong một dự án trong một thư mục được thiết lập. Đôi khi - một vài tháng theo dõi - tôi cần làm lại một cái gì đó trong dự án đó nhưng tôi không thể nhớ những gì tôi đã làm. Tôi sử dụng mercurial hoặc git để theo dõi các thay đổi đối với các tệp nhưng tôi muốn có thể nhớ những lệnh tôi đã ban hành trong thư mục đó.

Tìm kiếm trong lịch sử vỏ của tôi không nhiều thông tin. Tôi đã đăng nhập mọi thứ vào tập tin lịch sử. * _, Nhưng tôi muốn có một danh sách những việc tôi đã làm trong ~ / foo / bar, và không phải tất cả (triệu) thứ khác mà tôi đã làm trong tuần đó. Tôi thậm chí có thể không nhớ tháng cuối cùng tôi làm việc trong dự án cụ thể đó.

Có ai có ý tưởng làm thế nào một tệp nhật ký thư mục dự án của tất cả các lệnh shell tôi đã sử dụng không? Tôi đang hình dung một lệnh như thế nào:

dự án của tôi

... sẽ đặt tệp nhật ký shell thành ~ / myproject / .history.log, tải lịch sử trước đó từ logfile đó và có thể cập nhật lời nhắc của tôi để cho tôi biết thư mục nào tôi đang làm việc (ví dụ: vcprompt để cung cấp phiên bản kiểm soát thông tin).

Có bất cứ điều gì ngoài đó như thế này?

Câu trả lời:


4

Trong trường hợp bạn chưa tìm ra điều này: điều bạn đang tìm kiếm là gói virtualenvwrapper tuyệt vời . Nó là một trình bao bọc xung quanh virtualenv của python và, trong khi nó thường được nhắc đến khi lấy về môi trường python, nó thực sự là một công cụ rất chung thỏa mãn trường hợp sử dụng của bạn.

Cài đặt

pip install virtualenvwrapper

hoặc là

easy_install virtualenvwrapper

và thêm công cụ khởi tạo vào cấu hình shell của bạn ( ~/.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

Sử dụng

# 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

Bạn cũng có các móc chung trong ~/.virtualenvs/{postactivate,postdeactivate,etc}đó được gọi mỗi khi bạn workon any_project.

Vì vậy, ví dụ, có dòng export HISTFILE="$VIRTUAL_ENV/bash_history"trong ~/virtualenvs/postactivatehook có nghĩa là $HISTFILEbiến sẽ được mở rộng mỗi lần cho một dự án khác.


3

Tôi cũng cần điều này và tôi đã đưa ra một phiên bản sử dụng biến PROMPT_COMMAND của Bash :

Giá trị của biến PROMPT_COMMAND được kiểm tra ngay trước khi Bash in từng dấu nhắc chính. Nếu PROMPT_COMMAND được đặt và có giá trị khác null, thì giá trị được thực thi giống như khi nó được gõ trên dòng lệnh.

Vì vậy, tôi nói PROMPT_COMMAND = "check_for_local_history" trong ~ / .bashrc.my, đây check_for_local_historylà chức năng của tôi để kiểm tra xem lệnh thực thi cuối cùng có thay đổi thư mục hay không và khi đó là đúng, nó sẽ kiểm tra thư mục hiện tại mới cho tệp .bash_history . Nếu nó ở đó, sử dụng nó như là tập tin lịch sử.

Đây là ý chính hoàn chỉnh: https://gist.github.com/gurdiga/dac8d2e7eb3056d6b839


2

Một mẹo tôi sử dụng cho khung xây dựng các gói phụ cho sản phẩm là sử dụng vỏ phụ.

Đối với bash, bạn có thể tạo một tập lệnh shell như thế này:

#!/bin/bash

export PROJECT_DIRECTORY=$(pwd)

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

Sau đó, trong $HOME/.project-bashrcbạn đặt một cái gì đó như thế này:

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

Điều này cũng cho phép bạn tùy chỉnh lời nhắc trong .project-bashrctệp, có thể tiện dụng.

Tôi không chắc làm thế nào để làm điều tương tự zsh. Bạn nghĩ rằng bạn phải ghi đè lên ZDOTDIRbiến. Nhưng nó trông giống nhau.

Ciao!


1

Hãy xem kịch bản đăng nhập của tôi ở đây . Sử dụng một trong số chúng, bạn có thể theo dõi thư mục bạn đang sử dụng khi phát hành từng lệnh. Bạn có thể greptệp nhật ký cho lệnh hoặc thông tin khác. Tôi sử dụng phiên bản dài ở nhà và tại nơi làm việc.


Cảm ơn - Tôi sẽ xem xét điều này. Có thể làm một cái gì đó gần với những gì tôi cần!
Simon

1

Bạn có thể quan tâm đến một plugin tôi đã viết được gọi là lịch sử thư mục cho zsh.
Xem tại đây: https://github.com/tymm/directory-history

Mặc dù nó không thực sự phù hợp với bạn workon myproject công việc, nó hoàn hảo phải phù hợp với nhu cầu của bạn.

Nó tạo ra một lịch sử bao gồm các thư mục.
Khi bạn tìm kiếm trong lịch sử của mình, trước tiên bạn sẽ nhận được các lệnh từ thư mục bạn đang ở.
Nếu không còn lệnh nào cho thư mục đó, nó sẽ quay lại lịch sử toàn cầu và đề xuất các lệnh được sử dụng trong các thư mục khác.


1

Nếu bạn muốn một cái gì đó đơn giản, bạn có thể có .history.logtệp của bạn như vậy:

#!/bin/cat
some
relevant
commands

Sau đó chạy tệp sẽ catnhững lệnh bạn liệt kê trong đó.
Bạn cũng có thể nhóm các lệnh đó trong các tệp riêng biệt theo chức năng như quy ước:

.howto.datadump
.howto.restart

Điều này có thêm lợi thế làm việc ra khỏi hộp và không gây ô nhiễm môi trường của bạn.


Ngoài ra, bạn có thể sử dụng README.mdhoặc tạo các .mdtệp khác cho mỗi chủ đề và trỏ đến chúng từ readme. Đó là nếu bạn có giao diện kiểm soát nguồn thân thiện.
Reno

1

Để có được một tệp lịch sử cục bộ cho một thư mục, tôi đã thêm dòng sau vào lệnh bash prompt của mình.

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

Lệnh touch .local_historytrong một thư mục sau đó cung cấp cho tôi một tệp lịch sử cục bộ cho tất cả các lệnh được thực thi trong thư mục đó mà không mất tệp lịch sử chính. Một cái gì đó tương tự sẽ làm việc trong zsh tôi đoán.


0

Trong bash ít nhất, HISTFILE chỉ được tư vấn khi bắt đầu phiên bản shell. Ý tưởng per-dir sẽ không hoạt động ở đây, trừ khi ví dụ 'workon' của bạn ở trên tạo ra một thể hiện shell.

Có lẽ bạn có thể nhìn vào một cái gì đó như

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

Nhưng kịch bản cũng tạo ra một subshell.

Nói tóm lại, có lẽ bạn sẽ cần các cấp độ con lộn xộn để làm việc này.


Chết tiệt, tôi đã hy vọng nó sẽ là một cái gì đó đơn giản. Dẫu sao cũng xin cảm ơn!
Simon

0

Tôi đã làm việc trong các nhà phần mềm sản xuất nơi chúng tôi chỉ tạo người dùng và nhóm mới cho các chức năng khác nhau. Tài khoản người dùng mới dành riêng cho quản lý cấu hình hoặc bản dựng phần mềm với mức độ hiển thị khác nhau vào các khu vực chức năng liên quan khác thông qua tư cách thành viên nhóm và ACL, và lịch sử lệnh được thực hiện bằng cách nói, cmmgrsẽ được lưu vào ~cmmgr/.bash_history, bldmgrtừ liên quan sẽ được lưu vào ~bldmgr/.bash_history, v.v. để đăng nhập, người dùng phải sở hữu thư mục đăng nhập của họ. Do đó, một khu vực dự án đã được thiết lập hoàn toàn trên một đĩa riêng biệt. Quyền sở hữu của người tạo tệp cho thấy khu vực chức năng nào đã tạo các tệp trong khu vực dự án, nơi mà sự phù hợp .bash_historycó thể được kiểm tra.

Tuy nhiên, cách tiếp cận trên không cung cấp cho bạn mức độ chi tiết mà bạn mong muốn, tuy nhiên, nó mang lại cho bạn một bộ xương mà khi kết hợp với thành viên nhóm, người dùng có thể chuyển đổi các nhóm newgrptạo vỏ và môi trường mới một cách hiệu quả, sau đó sử dụng một nhóm về các cách tiếp cận được đưa ra trong các câu trả lời khác để thay đổi ~/.bash_historytệp hiệu quả khi chuyển đổi mũ , cmmgrđể newgrpcó thể quản lý ~/.bash_historyđược sử dụng và lưu trên mỗi thư mục khi một người vào và thoát khỏi nhóm mới thông qua newgrplệnh. Kiểm tra man newgrp. Có một số điểm bắt đầu dọc theo những dòng này trong các câu trả lời khác cho câu hỏi này. Chúng nên hoạt động với mô hình nhóm UNIX - hầu hết các đai ốc và bu lông được xử lý bởi các thói quen khởi động và thoát vỏ được kiểm soát bởinewgrpcầu khẩn. Kiểm tra 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

Ở đây tôi trình bày hai biến thể, nhưng chỉ áp dụng cho Z Shell .

Biến thể 1

Đây là những gì tôi nghĩ đến đầu tiên khi đọc tiêu đề câu hỏi của bạn. Với biến thể này, bạn có thể chuyển đổi giữa hai chế độ lịch sử với ALT+ h: Toàn cầu hoặc cục bộ , trong đó chế độ sau chuyển sang lịch sử trên mỗi thư mục theo chdir . Lịch sử toàn cầu tích lũy tất cả các lệnh đã ban hành.

  • Trình diễn

    ~ nguồn src / cd_history
    ~ tiếng vang lịch sử toàn cầu                                                
    lịch sử toàn cầu
    ~ thanh mkdir foo                                                      
    ~ [ALT-h] 
    ~                          lưu ý chỉ báo cho lịch sử địa phương ->    +
    ~ cd foo +
    ~ / foo lặp lại lịch sử địa phương trong foo +
    lịch sử địa phương trong foo
    ~ / foo fc -l +
        1 tiếng vang lịch sử địa phương trong foo
    ~ / foo cd ../bar +
    ~ / bar lặp lại lịch sử địa phương trong thanh +
    lịch sử địa phương trong quán bar
    ~ / thanh fc -l +
        1 tiếng vang lịch sử địa phương trong thanh
    ~ / thanh cd ../foo +
    ~ / foo fc -l +
        1 tiếng vang lịch sử địa phương trong foo
        3 cd ../bar
    ~ / foo [ALT-h]                                           
    ~ / foo fc -l                                                          
       55 nguồn src / cd_history
       64 tiếng vang lịch sử toàn cầu
       Thanh foo 65 mkdir
       66 cd foo
       70 tiếng vang lịch sử địa phương trong thanh
       72 cd ../foo
       73 tiếng vang lịch sử địa phương trong foo
       74 cd ../bar
    ~ / foo  
  • Kịch bản (được bao gồm trong ~/.zshrchoặc có nguồn gốc)

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

Biến thể 2

Nghĩ lại về nó, có vẻ như lịch sử per-dir là quá tốt và bạn cũng mô tả thêm về lịch sử mỗi dự án trong cơ thể câu hỏi của bạn. Vì vậy, tôi đã đưa ra một biến thể khác với chức năng workon để chuyển đổi giữa các dự án. Mỗi dự án có tập tin lịch sử riêng của mình ~/.zsh_projhistory_[name].

  • Trình diễn

    ~ nguồn src / proj_history 
    ~ tiếng vang lịch sử toàn cầu                                                                    
    lịch sử toàn cầu
    ~ [ALT-h]                                                               [sử dụng công việc]
    ~ workon foo [sử dụng workon]
    ~ lệnh echo trong dự án foo [trên proj foo]
    lệnh trong dự án foo
    ~ fc -l [trên proj foo]
        1 lệnh echo trong dự án foo
    ~ thanh công việc [trên proj foo]
    ~ echo một proj khác, thanh được đặt tên [trên thanh proj]
    một proj khác, thanh tên
    ~ fc -l [trên thanh proj]
        1 vang một proj khác, thanh tên
    ~ workon foo [trên thanh proj]
    ~ fc -l [trên proj foo]
        1 lệnh echo trong dự án foo
        3 thanh làm việc
    ~ [ALT-h]                                                              [trên proj foo]
    ~
    ~ fc -l                                                                                   
       31 tiếng vang lịch sử toàn cầu
       36 vang một proj khác, thanh tên
       38 nhân viên
       Lệnh 39 echo trong dự án foo
       40 thanh làm việc
    ~ ls -1 .zsh_ *
    .zsh_history
    .zsh_projhistory_bar
    .zsh_projhistory_foo
  • Kịch bản (được bao gồm trong ~/.zshrchoặc có nguồn gốc)

    # 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

Sau khi làm việc trong một khu vực một lúc.

lịch sử> hist1.txt sau đó lịch sử sau> hist2.txt

Đôi khi tôi sử dụng ngày cho tên tệp. lịch sử> hist20180727.txt

Bằng cách này, có một lịch sử lệnh gần đây cho mỗi thư mục.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.