디렉토리 별 bash / zsh 히스토리 로그 파일


14

set 디렉토리의 프로젝트에서 많은 작업을 수행합니다. 때로는 몇 달이 지나서 그 프로젝트에서 무언가를 다시 실행해야하지만 내가 한 일을 기억하지 못하는 경우가 있습니다. 수은 또는 git을 사용하여 파일의 변경 사항을 추적 하지만 해당 디렉토리에서 어떤 명령을 실행했는지 기억하고 싶습니다.

내 쉘 히스토리를 검색하는 것은 그리 유익하지 않습니다. 나는 이미 모든 것을 내. * _ history 파일에 기록하지만 ~ / foo / bar에서 한 일의 목록을 원하지만 그 주에 한 다른 (백만) 일이 모두 필요하지 않습니다. 나는 그 특정 프로젝트에서 마지막으로 몇 달을 일했는지 기억조차 못합니다.

누구든지 내가 사용한 모든 쉘 명령의 프로젝트 디렉토리 로그 파일에 대한 아이디어가 있습니까? 다음과 같은 명령을 구상하고 있습니다.

workon myproject

... 셸 로그 파일을 ~ / myproject / .history.log로 설정하고 해당 로그 파일에서 이전 기록을로드 한 다음 작업중인 디렉토리를 알려주도록 프롬프트를 업데이트 할 수 있습니다 (예 : vcprompt와 같이 버전 제공) 제어 정보).

이와 같은 것이 있습니까?

답변:


4

아직 이해하지 못한 경우 : 훌륭한 virtualenvwrapper 패키지가 필요합니다. 그것은 파이썬의 virtualenv (go figure)를 감싸는 래퍼 이며 파이썬 환경을 취할 때 일반적으로 언급되지만 실제로는 사용 사례를 충족시키는 매우 일반적인 도구입니다.

설치

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

나도 이것을 필요로하고 Bash의 PROMPT_COMMAND 변수 를 사용하는 버전을 생각해 냈습니다 .

변수 PROMPT_COMMAND의 값은 Bash가 각 기본 프롬프트를 인쇄하기 직전에 검사됩니다. PROMPT_COMMAND가 설정되고 널이 아닌 값을 갖는 경우, 값은 명령 행에 입력 된 것처럼 실행됩니다.

~ / .bashrc.my의 PROMPT_COMMAND = "check_for_local_history"라고 말하면 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변수 를 재정의해야 한다고 생각합니다. 그러나 비슷하게 보일 것입니다.

챠오!


1

내 기록 스크립트를 살펴보세요 여기를 . 이들 중 하나를 사용하면 각 명령을 실행할 때 사용중인 디렉토리를 추적 할 수 있습니다. grep명령 또는 기타 정보에 대한 로그 파일을 사용할 수 있습니다 . 나는 집과 직장에서 긴 버전을 사용합니다.


감사합니다-이것에 대해 살펴 보겠습니다. 내가 필요한 것에 가까운 것을 할 수 있습니다!
Simon

1

zsh 용 directory-history 라는 플러그인에 관심이있을 수 있습니다 .
여기를보십시오 : https://github.com/tymm/directory-history

workon myproject 워크 플로우 에는 실제로 맞지는 않지만 요구 사항에 완벽하게 맞아야합니다.

디렉토리를 포함하는 히스토리를 작성합니다.
히스토리를 검색 할 때는 먼저 현재있는 디렉토리에서 명령을 가져옵니다.
해당 디렉토리에 남아있는 명령이 없으면 글로벌 히스토리로 돌아가서 다른 디렉토리에서 사용되는 명령을 제안합니다.


1

간단한 것을 원한다면 .history.log파일을 다음과 같이 가질 수 있습니다 .

#!/bin/cat
some
relevant
commands

그런 다음 파일을 실행하면 파일에 cat나열된 명령이 실행 됩니다.
기능별로 규칙에 따라 해당 명령을 별도의 파일로 그룹화 할 수도 있습니다.

.howto.datadump
.howto.restart

이는 즉시 사용하고 환경을 오염시키지 않는 이점이 있습니다.


또는 주제별로 README.md다른 .md파일 을 사용 하거나 작성 하여 추가 정보에서 해당 파일을 가리킬 수 있습니다. 마크 다운 친화적 인 소스 제어 인터페이스가있는 경우입니다.
Reno

1

디렉토리의 로컬 히스토리 파일을 얻으려면 bash prompt 명령에 다음 줄을 추가했습니다.

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

touch .local_history그런 다음 디렉토리 의 명령 은 주 기록 파일을 잃지 않고 해당 디렉토리에서 실행 된 모든 명령에 대한 로컬 기록 파일을 제공합니다. zsh에서 비슷한 것이 작동한다고 생각합니다.


0

bash에서 적어도 HISTFILE은 쉘 인스턴스 시작시에만 참조됩니다. 위의 'workon'예제가 쉘 인스턴스를 작성하지 않으면 디렉토리 별 아이디어는 여기서 작동하지 않습니다.

아마도 당신은 같은 것을 볼 수 있습니다

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

그러나 스크립트는 또한 서브 쉘을 작성합니다.

요컨대, 이것이 작동하려면 지저분한 수준의 서브 쉘이 필요할 것입니다.


젠장, 나는 그것이 간단한 것이기를 바랐다. 어쨌든 고마워!
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 Shell 에만 적용됩니다 .

변형 1

이것이 질문 제목을 읽을 때 처음 생각한 것입니다. 이 변형하면 두 개의 기록 모드 사이를 전환 할 수 있습니다 ALT+ h: 글로벌 또는 지역 , 어디 디렉토리 별 역사 후자의 스위치 CHDIR에 따라 자동으로 . 글로벌 히스토리 는 발행 된 모든 명령을 축적 합니다.

  • 데모

    ~ 소스 src / cd_history
    ~ 세계사 에코                                                
    세계사
    ~ mkdir foo 바                                                      
    ~ [ALT-h] 
    ~                          지역 이력 표시 참고->    +
    ~ cd foo +
    ~ / foo는 foo에서 로컬 히스토리를 에코합니다.
    foo의 현지 역사
    ~ / foo fc -l +
        foo에서 1 개의 에코 로컬 히스토리
    ~ / foo cd ../bar +
    ~ / bar 바의 로컬 히스토리 에코
    바의 현지 역사
    ~ / bar fc -l +
        바에서 1 지역 반향 기록
    ~ / bar cd ../foo +
    ~ / foo fc -l +
        foo에서 1 개의 에코 로컬 히스토리
        3 cd ../bar
    ~ / foo [ALT-h]                                           
    ~ / foo fc -l                                                          
       55 소스 src / cd_history
       64 에코 세계사
       65 mkdir foo 바
       66 cd foo
       70 에코 반향 기록
       72 cd ../foo
       foo에서 73 에코 역사
       74cd ../ 바
    ~ / 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

다시 생각해 보면, dir per per history는 너무 세밀한 것으로 보이고, 질문 본문에서 프로젝트 별 히스토리를 더 많이 묘사하는 것 같습니다. 그래서 프로젝트 간을 전환 하는 workon 함수 가있는 다른 변형을 생각해 냈습니다 . 모든 프로젝트에는 자체 히스토리 파일이 ~/.zsh_projhistory_[name]있습니다.

  • 데모

    ~ 소스 src / proj_history 
    ~ 세계사 에코                                                                    
    세계사
    ~ [ALT-h]                                                               [작업 중]
    ~ workon foo [사용 workon]
    ~ 프로젝트 foo의 echo 명령 [on proj foo]
    프로젝트 foo의 명령
    ~ fc -l [proj foo]
        프로젝트 foo의 1 echo 명령
    ~ 작업 표시 줄 [proj foo]
    ~ bar라는 이름의 다른 프로젝트를 반향 [proj bar]
    bar라는 또 다른 프로젝트
    ~ fc -l [프로젝트 모음]
        1 bar라는 다른 프로젝트를 에코
    ~ workon foo [프로젝트 모음]
    ~ fc -l [proj foo]
        프로젝트 foo의 1 echo 명령
        3 워크 온 바
    ~ [ALT-h]                                                              [proj foo]
    ~
    ~ fc -l                                                                                   
       31 에코 세계사
       36 이름이 bar 인 다른 프로젝트를 에코
       38 노동자 foo
       foo 프로젝트의 39 echo 명령
       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

한 영역에서 잠시 작업 한 후

history> hist1.txt 그리고 나중에 history> hist2.txt

때로는 파일 이름에 날짜를 사용합니다. 역사> hist20180727.txt

이런 식으로 각 디렉토리에 대한 최근 명령 기록이 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.