Pamiętasz „lokalną” historię bashów w folderze?

11

Mam skrypt w folderze, którego używam z długimi argumentami. Czy jest jakaś szansa, że ​​mogę mieć historię poleceń wykonanych w tym konkretnym katalogu zamiast wracać do całej historii?

faber
źródło
3
Interesujące pytanie. BTW, zamiast wracać „przez całą historię”, możesz użyć Ctrl + R, aby ją przeszukać, to właśnie zrobiłbym w takich sytuacjach.
phk
tak, to pomaga, ale w ten sposób mam tylko ostatni. Czy istnieje możliwość uzyskania więcej niż jednego wyniku?
faber
1
Możesz wcisnąć Ctrl + R po wprowadzeniu części nazwy polecenia.
mtahmed
history | lessbyć może? Naprawdę nie odpowiada na twoje pytanie, ale od tego bym zaczął.
roaima
@roaima Następnie wyszukiwanie za pomocą „/” + wyszukiwane hasło + enter, a następnie „n” / „N” w celu dalszego wyszukiwania do przodu / do tyłu.
phk

Odpowiedzi:

2

Podłączając się do PROMPT_COMMAND firmy bash, ta funkcja uruchamia się za każdym razem, gdy pojawi się nowy monit, więc jest to dobry czas, aby sprawdzić, czy znajdujesz się w katalogu, dla którego chcesz mieć własną historię. Funkcja ma cztery główne gałęzie:

  1. Jeśli bieżący katalog ( $PWD) nie zmienił się, nie rób nic (powrót).

Jeśli PWD uległo zmianie, wówczas konfigurujemy funkcję lokalną, której jedynym celem jest faktyczne umieszczenie kodu „katalogu niestandardowego” w jednym miejscu. Będziesz chciał zastąpić moje katalogi testowe własnymi (oddzielonymi przez |).

  1. Jeśli nie zmieniliśmy katalogu niestandardowego ani nie wyszliśmy z niego, po prostu zaktualizuj zmienną „poprzedni katalog” i powróć z funkcji.

Ponieważ zmieniliśmy katalogi, zaktualizuj zmienną „poprzedni katalog”, a następnie zapisz historię w pamięci do HISTFILE, a następnie wyczyść historię w pamięci.

  1. Jeśli zmieniliśmy w katalogu niestandardowym, a następnie ustawić HISTFILE być .bash_historyplik w bieżącym katalogu.

  2. W przeciwnym razie, zmieniliśmy z katalogu niestandardowym, więc zresetować HISTFILE do jednej akcji.

Wreszcie, ponieważ zmieniliśmy pliki historii, przeczytaj ponownie poprzednią historię.

Aby wszystko działało, skrypt ustawia wartość PROMPT_COMMAND i zapisuje dwie zmienne do użytku wewnętrznego (podstawowy HISTFILE i „poprzedni katalog”).

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
Jeff Schaller
źródło
0

Odpowiedź Jeffa jest świetna, jeśli chcesz historii dla jednego katalogu, ale jeśli nie masz nic przeciwko instalowaniu zsh, możesz użyć katalogu na historię, aby uzyskać historię specyficzną dla katalogu dla wszystkich katalogów.

Możesz zainstalować zsh poprzez:

brew install zsh

Alternatywnie, jeśli chcesz zainstalować oh-my-zsh , możesz dodać wtyczkę histdb i napisać niestandardowe zapytanie, aby wysłać zapytanie do bazy danych sqlite dodanej przez histdb. Pisałem o tym i dodawałem automatyczne uzupełnianie w poście Dev Diaries . Sprawdź sekcję poleceń premiowych .

Zapytanie wygląda następująco

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

To akceptuje również opcjonalny limit:

show_local_history 50

na przykład.

Khaliq Gant
źródło
-1

Kiedy muszę kilkakrotnie użyć polecenia z długimi argumentami, zwykle tworzę alias w moim ~/.bash_aliaseslub możesz go umieścić w swoim, ~/.bashrcjeśli wolisz. Jest to łatwe i oszczędza czas, zamiast tego szukaj starych poleceń w historii.

andreatsh
źródło
1
To dobra wskazówka, ale nie tego szukał OP. OP był dość specyficzny dla tego, czego szukał (rozwiązanie również bym zapisał BTW).
phk
@phk Masz rację, następnym razem będę bardziej ostrożny! Dziękuję za wyjaśnienie!
andreatsh