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:
- 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 |
).
- 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.
Wenn wir uns verändert habenhineinein benutzerdefiniertes Verzeichnis, dann legen Sie HISTFILE als
.bash_history
Datei im aktuellen Verzeichnis fest.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_aliases
oder Sie können ihn in Ihrem einfügen, ~/.bashrc
wenn Sie das bevorzugen. Das ist einfach und spart Zeit, anstatt im Verlauf nach alten Befehlen zu suchen.