Erinnern Sie sich an den "lokalen" Bash-Verlauf in einem Ordner?

11

Ich habe ein Skript in einem Ordner, das ich mit langen Argumenten verwende. Gibt es eine Möglichkeit, dass ich einen Verlauf der Befehle in diesem bestimmten Verzeichnis ausführen lassen kann, anstatt den gesamten Verlauf durchzugehen?

Faber
quelle
3
Interessante Frage. Übrigens, anstatt "durch den gesamten Verlauf" zu gehen, könnten Sie Strg + R verwenden, um danach zu suchen, das würde ich in solchen Situationen tun.
Phk
Ja, es hilft, aber auf diese Weise habe ich nur den letzten. Gibt es eine Möglichkeit, mehr als ein Ergebnis zu erzielen?
Faber
1
Sie können Strg + R gedrückt halten, nachdem Sie einen Teil des Befehlsnamens eingegeben haben.
Mtahmed
history | lessvielleicht? Es beantwortet Ihre Frage nicht wirklich, aber hier würde ich anfangen.
Roaima
@roaima Und dann mit "/" + Suchbegriff + Eingabe und dann mit "n" / "N" suchen, um weiter vorwärts / rückwärts zu suchen.
Phk

Antworten:

2

Wenn Sie sich in PROMPT_COMMAND von bash einbinden, wird diese Funktion jedes Mal ausgeführt, wenn Sie eine neue Eingabeaufforderung erhalten. Es ist also eine angemessene Zeit, um zu überprüfen, ob Sie sich in einem Verzeichnis befinden, für das Sie einen benutzerdefinierten Verlauf wünschen. Die Funktion hat vier Hauptzweige:

  1. Wenn sich das aktuelle Verzeichnis ( $PWD) nicht geändert hat, tun Sie nichts (return).

Wenn das PWD hat geändert, dann setzen wir eine lokale Funktion , deren einziger Zweck nach oben ist das „Custom - Verzeichnis“ Code in einem Ort , an Faktor. Sie möchten meine Testverzeichnisse durch Ihre eigenen ersetzen (getrennt durch |).

  1. Wenn wir nicht in ein benutzerdefiniertes Verzeichnis gewechselt oder dieses verlassen haben, aktualisieren Sie einfach die Variable "Vorheriges Verzeichnis" und kehren Sie aus der Funktion zurück.

Da wir die Verzeichnisse geändert haben, aktualisieren Sie die Variable "Vorheriges Verzeichnis", speichern Sie den In-Memory-Verlauf in der HISTFILE und löschen Sie den In-Memory-Verlauf.

  1. Wenn wir in ein benutzerdefiniertes Verzeichnis gewechselt haben , legen Sie HISTFILE als .bash_historyDatei im aktuellen Verzeichnis fest.

  2. Andernfalls haben wir aus einem benutzerdefinierten Verzeichnis gewechselt. Setzen Sie daher HISTFILE auf das Standardverzeichnis zurück.

Da wir die Verlaufsdateien geändert haben, lesen Sie den vorherigen Verlauf zurück.

Um die Dinge in Gang zu bringen, legt das Skript den Wert PROMPT_COMMAND fest und speichert zwei Variablen für den internen Gebrauch (die Standard-HISTFILE und das "vorherige Verzeichnis").

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
quelle
0

Jeffs Antwort ist großartig, wenn Sie den Verlauf für ein einzelnes Verzeichnis möchten. Wenn Sie jedoch mit der Installation von zsh einverstanden sind, können Sie das Verzeichnis pro Verlauf verwenden , um einen für das Verzeichnis spezifischen Verlauf für alle Verzeichnisse abzurufen.

Sie können zsh installieren, indem Sie:

brew install zsh

Wenn Sie oh-my-zsh installieren möchten , können Sie alternativ das Histdb- Plugin hinzufügen und eine benutzerdefinierte Abfrage schreiben , um die von Histdb hinzugefügte SQLite- Datenbank abzufragen. Ich habe darüber geschrieben und automatische Vervollständigungen in einem Dev Diaries- Beitrag hinzugefügt . Überprüfen Sie den Abschnitt mit den Bonusbefehlen .

Die Abfrage sieht so aus

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

Dies akzeptiert auch ein optionales Limit:

show_local_history 50

beispielsweise.

Khaliq Gant
quelle
-1

Wenn ich einen Befehl mit langen Argumenten mehrmals verwenden muss, erstelle ich normalerweise einen Alias ​​in meinem ~/.bash_aliasesoder Sie können ihn in Ihren einfügen, ~/.bashrcwenn Sie dies bevorzugen. Es ist einfach und spart Zeit, stattdessen nach alten Befehlen in der Geschichte zu suchen.

andreatsh
quelle
1
Das ist ein guter Hinweis, aber nicht das, wonach OP gesucht hat. OP war ziemlich spezifisch für das, wonach er / sie suchte (eine Lösung, die ich übrigens auch anmelden würde).
Phk
@phk Du hast recht, ich werde das nächste Mal vorsichtiger sein! Danke für Ihre Erklärung!
Andreatsh