У меня есть скрипт в папке, который я использую с длинными аргументами. Есть ли возможность получить историю команд, выполненных в этом конкретном каталоге, вместо того, чтобы просматривать всю историю?
решение1
Подключаясь к PROMPT_COMMAND bash, эта функция запускается каждый раз, когда вы получаете новое приглашение, так что это подходящее время, чтобы проверить, находитесь ли вы в каталоге, для которого вы хотите иметь собственную историю. Функция имеет четыре основные ветви:
- Если текущий каталог (
$PWD
) не изменился, то ничего не делать (вернуться).
Если PWDимеетизменено, затем мы настраиваем локальную функцию, единственной целью которой является факторизация кода "пользовательского каталога" в одном месте. Вы захотите заменить мои тестовые каталоги своими собственными (разделенными |
).
- Если мы не перешли в пользовательский каталог или не вышли из него, то просто обновите переменную «предыдущий каталог» и вернитесь из функции.
Поскольку мы сменили каталоги, обновите переменную «предыдущий каталог», затем сохраните историю в памяти в HISTFILE, затем очистите историю в памяти.
Если мы изменилисьвпользовательский каталог, затем установите HISTFILE в качестве
.bash_history
файла в текущем каталоге.В противном случае мы изменились.снаружипользовательский каталог, поэтому сбросьте 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
решение2
Джеффсотвечатьотлично подходит, если вам нужна история для одного каталога, но если вас устраивает установказшВы могли бы использоватьпо-истории-каталогадля получения истории, относящейся к каталогу, для всех каталогов.
Установить zsh можно следующим образом:
brew install zsh
В качестве альтернативы, если вы хотите установитьо-мой-зш, вы могли бы добавить висторическая база данныхплагин и написать пользовательский запрос для запроса к базе данных SQLite, которую добавляет histdb. Я писал об этом и добавлении автодополнений вДневники разработчиковпост. Проверьтебонусные командыраздел.
Запрос выглядит так
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
например.
решение3
Когда мне нужно использовать команду с длинными аргументами несколько раз, я обычно создаю псевдоним в my ~/.bash_aliases
или вы можете поместить его в your, ~/.bashrc
если вам так больше нравится. Это просто и экономит время вместо того, чтобы искать старые команды в истории.