Файли журналу bash / zsh історії в каталозі


14

Я вважаю, що я багато працюю над проектом у наборі каталогу. Іноді - за кілька місяців доріжки - мені потрібно щось переробити на цьому проекті, але я не можу пригадати, що я зробив. Я використовую mercurial або git для відстеження змін у файлах, але я хочу мати можливість запам'ятати, які команди я видав у цьому каталозі.

Пошук у моїй історії оболонок не дуже інформативний. Я вже записую все до своїх файлів. * _ Історії, але я хочу список речей, які я робив у ~ / foo / bar, а не всі інші (мільйонні) речі, які я робив на цьому тижні. Я, мабуть, навіть не пам'ятаю, в якому місяці я востаннє працював над цим проектом.

Хтось має ідеї, як файл журналу каталогів проектів усіх команд оболонок, які я використовував? Я маю на увазі команду на кшталт:

мій проект

... який би встановив файл журналу оболонки на ~ / myproject / .history.log, завантажив попередню історію з цього журналу файлів, і, можливо, оновіть мою підказку, щоб сказати мені, над яким каталогом я працюю (наприклад, vcprompt для надання версії контрольна інформація).

Чи є щось подібне?

Відповіді:


4

Якщо ви ще цього не зрозуміли: ви шукаєте - відмінний пакет virtualenvwrapper . Це обгортка навколо virtualenv python ( ідеальна фігура), і, як це зазвичай називають при використанні середовищ python, це насправді дуже загальний інструмент, який задовольняє ваш випадок використання.

Установка

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 Bash :

Значення змінної PROMPT_COMMAND вивчається безпосередньо перед тим, як Bash надрукує кожну первинну підказку. Якщо PROMPT_COMMAND встановлено і має ненульове значення, то значення виконується так само, як якщо б воно було введено в командному рядку.

Тому я кажу 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Я думаю, вам доведеться перекрити змінну. Але це було б схоже.

Чіао!


1

Подивіться мої сценарії реєстрації тут . Використовуючи одну з них, ви можете відслідковувати, в якому каталозі ви знаходитесь, коли ви видаєте кожну команду. Ви можете grepзаписати файл журналу для команди або іншої інформації. Я використовую довгу версію вдома і на роботі.


Спасибі - я розберуся в цьому. Можна зробити щось близьке до того, що мені потрібно!
Симон

1

Можливо, вас зацікавить плагін, який я написав під назвою " Історія каталогів" для zsh.
Подивіться тут: https://github.com/tymm/directory-history

Хоча це не дуже відповідає вашому робочому процесу в режимі mykon , він повинен повністю відповідати вашим потребам.

Він створює історію, яка включає каталоги.
Під час пошуку вашої історії спочатку ви отримаєте команди з каталогу, в якому ви перебуваєте.
Якщо для цього каталогу не залишилося жодних команд, він повернеться до глобальної історії та запропонує команди, що використовуються в інших каталогах.


1

Якщо ви хочете чогось простого, ви можете мати свій .history.logфайл як такий:

#!/bin/cat
some
relevant
commands

Тоді запуск файла буде catтими командами, які ви вказали в ньому.
Ви також можете згрупувати ці команди в окремі файли за функціональністю як звичайно:

.howto.datadump
.howto.restart

Це має додаткову перевагу розробки коробки та не забруднюючи ваше середовище.


Крім того, ви можете скористатися README.mdабо створити інші .mdфайли за темою та вказати на них із readme. Це якщо у вас є інтерфейс управління джерелом для відмітки.
Рено

1

Щоб отримати файл локальної історії для каталогу, я додав наступний рядок до своєї команди bash prompt.

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

Потім команда touch .local_historyв каталозі дає мені файл локальної історії для всіх команд, виконаних у цьому каталозі, не втрачаючи головний файл історії. Щось подібне працювало б в zsh, мабуть.


0

Щонайменше, в Bash, HISTFILE консультується лише при запуску екземпляра оболонки. Ідея за dir тут не працюватиме, якщо ваш приклад "workon" вище не створить екземпляр оболонки.

Можливо, ви можете подивитися на щось подібне

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

Але скрипт також створює підзарядку.

Коротше кажучи, вам, мабуть, знадобляться безладні рівні підрозділів, щоб змусити це працювати.


Чорт, я сподівався, що це буде щось просте. Все одно, дякую!
Симон

0

Я працював у виробничих програмних будинках, де ми просто створили нових користувачів та груп для різних функцій. Нові облікові записи користувачів, спеціально для управління конфігурацією або побудови програмного забезпечення, з різним рівнем видимості в інших пов'язаних функціональних областях через членство в групі та ACL, а історія команд, виконана скажімо, cmmgrбуде збережена в ~cmmgr/.bash_history, bldmgrпов'язане слово буде збережено в ~bldmgr/.bash_historyі т.д. На жаль, щоб увійти, користувач повинен володіти своєю каталогом входу. Тому область проекту була створена на окремому диску взагалі. Право власника на файл показало, яка функціональна область створювала файли в області проекту, для чого відповідна .bash_historyможе бути вивчена.

Наведений вище підхід, однак, не дає тобі детальності, якої ви бажаєте, однак, це дає вам скелет того, що в поєднанні з членством у групі користувач може перемикати групи, за допомогою newgrpяких ефективно створюється нова оболонка та середовище, а потім використовувати один з підходів, наведених в інших відповідях, щоб змінити ефективний ~/.bash_historyфайл при переключенні капелюхів на вимову, cmmgrщоб a 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 . Глобальна історія акумулює всі видані команди.

  • Демонстрація

    ~ source src / cd_history
    ~ відлуння глобальної історії                                                
    глобальна історія
    ~ mkdir foo bar                                                      
    ~ [ALT-h] 
    ~                          відзначте показник для локальної історії ->    +
    ~ cd foo +
    ~ / foo відлунює краєзнавство у foo +
    краєзнавство в foo
    ~ / foo fc -l +
        1 відлуння краєзнавства в foo
    ~ / foo cd ../bar +
    ~ / bar відлуння краєзнавства в барі +
    краєзнавство в барі
    ~ / бар fc -l +
        1 відлуння краєзнавства в барі
    ~ / бар cd ../foo +
    ~ / foo fc -l +
        1 відлуння краєзнавства в foo
        3 кд ../бар
    ~ / foo [ALT-h]                                           
    ~ / foo fc -l                                                          
       55 джерело src / cd_history
       64 відлуння глобальної історії
       65 mkdir foo bar
       66 cd foo
       70 ехо краєзнавства в барі
       72 кд ../фу
       73 відлуння краєзнавства в foo
       74 кд ../бар
    ~ / 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]                                                               [використовувати робочий]
    ~ workon foo [використовувати workon]
    ~ команда echo в проект foo [on proj foo]
    команда в foo проекту
    ~ fc -l [на proj foo]
        1 команда echo в foo проекту
    ~ панель роботи [on proj foo]
    ~ echo інший proj, названий бар [на proj bar]
    інший proj, названий бар
    ~ fc -l [на proj bar]
        1 відлуння іншого proj, названого bar
    ~ workon foo [на proj bar]
    ~ fc -l [на proj foo]
        1 команда echo в foo проекту
        3 панель роботи
    ~ [ALT-h]                                                              [на proj foo]
    ~
    ~ fc -l                                                                                   
       31 відлуння глобальної історії
       36 відлуння іншого proj, названого bar
       38 workon foo
       39 команда ехо в проекті foo
       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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.