Пам'ятаєте "локальну" історію баш у папці?


11

У мене в папці є сценарій, який я використовую з довгими аргументами. Чи є якийсь шанс, щоб я міг мати історію команд, виконаних у цьому конкретному каталозі, замість того, щоб повернутися назад через усю історію?


3
Цікаве запитання. До речі, якщо не повернутися "через всю історію", ви можете використовувати Ctrl + R для його пошуку, ось що я б робив у таких ситуаціях.
phk

так, це допомагає, але таким чином у мене є лише останній. Чи є можливість мати більше одного результату?
faber

1
Ви можете продовжувати натискання клавіш Ctrl + R після введення частини імені команди.
mtahmed

history | lessможливо? Це насправді не відповідає на ваше запитання, але саме з цього я б почав.
roaima

@roaima А потім пошук за допомогою "/" + пошукового терміна + введіть, а потім "n" / "N" для подальшого пошуку вперед / назад.
phk

Відповіді:


2

Підключившись до PROMPT_COMMAND bash, ця функція запускається щоразу, коли ви отримуєте нове підказку, тому пристойний час перевірити, чи є ви в каталозі, для якого ви хочете користувацьку історію. Функція має чотири основні гілки:

  1. Якщо поточний каталог ( $PWD) не змінився, не робіть нічого (повернення).

Якщо PWD був змінений, то ми створили локальну функцію, єдиною метою якої є фактора «користувальницького каталогу» код в одному місці. Ви хочете замінити мої тестові каталоги на власні (розділені на |).

  1. Якщо ми не перейшли у спеціальний каталог або вийшли з нього, просто оновіть змінну «попередній каталог» та поверніться з функції.

Оскільки ми змінили каталоги, оновіть змінну "попередній каталог", а потім збережіть історію в пам'яті в HISTFILE, а потім очистіть історію в пам'яті.

  1. Якщо ми перейшли в спеціальний каталог, то встановіть HISTFILE як .bash_historyфайл у поточній директорії.

  2. В іншому випадку, ми змінили з користувальницького каталогу, тому скидання HISTFILE на складі одного.

Нарешті, оскільки ми змінили файли історії, прочитайте їх у попередній історії.

Щоб покращити ситуацію, сценарій встановлює значення PROMPT_COMMAND і зберігає дві змінні внутрішнього використання (фондовий HISTFILE та "попередній каталог").

prompt_command() {
  # if PWD has not changed, just return
  [[ $PWD == $_cust_hist_opwd ]] && return

  function iscustom {
    # returns 'true' if the passed argument is a custom-history directory
    case "$1" in
      ( */tmp/faber/somedir | */tmp/faber/someotherdir ) return 0;;
      ( * ) return 1;;
    esac
  }

  # PWD changed, but it's not to or from a custom-history directory,
  # so update opwd and return
  if ! iscustom "$PWD" && ! iscustom "$_cust_hist_opwd"
  then
    _cust_hist_opwd=$PWD
    return
  fi

  # we've changed directories to and/or from a custom-history directory

  # save the new PWD
  _cust_hist_opwd=$PWD

  # save and then clear the old history
  history -a
  history -c

  # if we've changed into or out of a custom directory, set or reset HISTFILE appropriately
  if iscustom "$PWD"
  then
    HISTFILE=$PWD/.bash_history
  else
    HISTFILE=$_cust_hist_stock_histfile
  fi

  # pull back in the previous history
  history -r
}

PROMPT_COMMAND='prompt_command'
_cust_hist_stock_histfile=$HISTFILE
_cust_hist_opwd=$PWD

0

Джеффа відповідь є великим , якщо ви хочете історію для одного каталогу, але якщо ви все в порядку з установкою ЗШ ви могли б використовувати за історію-каталогу , щоб отримати історію , характерні для конкретного каталогу для всіх каталогів.

Ви можете встановити zsh:

brew install zsh

Крім того, якщо ви хочете встановити oh-my-zsh , ви можете додати в плагін histdb і написати спеціальний запит для запиту sqlite db, який додає histdb. Я написав про це і додав автоматичні доповнення в допис про щоденники Dev . Перевірте розділ бонусних команд .

Запит виглядає приблизно так

show_local_history() {
    limit="${1:-10}"
    local query="
        select history.start_time, commands.argv 
        from history left join commands on history.command_id = commands.rowid
        left join places on history.place_id = places.rowid
        where places.dir LIKE '$(sql_escape $PWD)%'
        order by history.start_time desc
        limit $limit
    "
    results=$(_histdb_query "$query")
    echo "$results"
}

Це також приймає необов'язковий ліміт:

show_local_history 50

наприклад.


-1

Коли мені потрібно кілька разів використовувати команду з довгими аргументами, я зазвичай створюю псевдонім у своєму ~/.bash_aliasesабо ви можете ввести його у свій, ~/.bashrcякщо вам зручніше. Це легко і заощадити час, а не шукати старі команди в історії.


1
Це хороший натяк, але не те, що шукала ОП. ОП був досить специфічним для того, що він / вона шукав (рішення я б підписав також BTW).
phk

@phk Ти маєш рацію, я буду обережнішим наступного разу! Дякуємо за ваше пояснення!
andreatsh
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.