„Lokalen“ Bash-Verlauf in einem Ordner speichern?

„Lokalen“ Bash-Verlauf in einem Ordner speichern?

Ich habe ein Skript in einem Ordner, das ich mit langen Argumenten verwende. Besteht die Möglichkeit, dass ich einen Verlauf der in diesem bestimmten Verzeichnis ausgeführten Befehle erhalten kann, anstatt den gesamten Verlauf durchzugehen?

Antwort1

Durch Einklinken in Bashs PROMPT_COMMAND wird diese Funktion jedes Mal ausgeführt, wenn Sie eine neue Eingabeaufforderung erhalten. Dies ist also ein guter Zeitpunkt, um zu prü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, dann nichts tun (zurückkehren).

Wenn die PWDhatgeändert, dann richten wir eine lokale Funktion ein, deren einziger Zweck darin besteht, den Code für das „benutzerdefinierte Verzeichnis“ an einem Ort zusammenzufassen. Sie sollten meine Testverzeichnisse durch Ihre eigenen ersetzen (getrennt durch |).

  1. Wenn wir nicht in ein benutzerdefiniertes Verzeichnis gewechselt sind oder es verlassen haben, aktualisieren Sie einfach die Variable „vorheriges Verzeichnis“ und kehren Sie aus der Funktion zurück.

Da wir das Verzeichnis gewechselt haben, aktualisieren wir die Variable „vorheriges Verzeichnis“, speichern dann den Verlauf im Arbeitsspeicher in der HISTFILE und löschen anschließend den Verlauf im Arbeitsspeicher.

  1. Wenn wir uns verändert habenhineinein benutzerdefiniertes Verzeichnis, dann legen Sie HISTFILE als .bash_historyDatei im aktuellen Verzeichnis fest.

  2. Ansonsten haben wir geändertausein benutzerdefiniertes Verzeichnis, also setzen Sie HISTFILE auf den Standardwert zurück.

Da wir Verlaufsdateien geändert haben, lesen Sie abschließend den vorherigen Verlauf noch einmal durch.

Um die Dinge in Gang zu bringen, legt das Skript den PROMPT_COMMAND-Wert fest und speichert zwei Variablen zur internen Verwendung (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

Antwort2

JeffsAntwortist großartig, wenn Sie den Verlauf für ein einzelnes Verzeichnis haben möchten, aber wenn Sie mit der Installation einverstanden sindzshDu könntest benutzenpro Verlaufsverzeichnisum einen verzeichnisspezifischen Verlauf für alle Verzeichnisse zu erhalten.

Sie können zsh wie folgt installieren:

brew install zsh

Alternativ, wenn Sie installieren möchtenoh mein Gottkönnen Sie in derhistdbPlugin und schreiben Sie eine benutzerdefinierte Abfrage, um die SQLite-Datenbank abzufragen, die histdb hinzufügt. Ich habe darüber geschrieben und das Hinzufügen von automatischen Vervollständigungen in einemEntwicklertagebücherBeitrag. Überprüfen Sie dieBonusbefehleAbschnitt.

Die Abfrage sieht folgendermaßen 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 eine optionale Begrenzung:

show_local_history 50

Zum Beispiel.

Antwort3

Wenn ich einen Befehl mit langen Argumenten mehrmals verwenden muss, erstelle ich normalerweise einen Alias ​​in meinem ~/.bash_aliasesoder Sie können ihn in Ihrem einfügen, ~/.bashrcwenn Sie das bevorzugen. Das ist einfach und spart Zeit, anstatt im Verlauf nach alten Befehlen zu suchen.

verwandte Informationen