Я немного опасаюсь возиться с настройками истории bash и просто хочу написать свою собственную историю bash. Я думал об использовании функции bash вроде этой:
bash(){
# write to a custom history file manually
echo "$@" >> $HOME/my_bash_history
command bash "$@"
}
export -f bash;
но это не совсем работает - происходит то, что command bash
берет на себя управление, и все больше не проходит через функцию bash. Мне нужно, чтобы весь stdin в bash проходил через эту функцию bash, чтобы все было записано в пользовательский файл. У кого-нибудь есть идеи, как это сделать?
решение1
Вам нужна DEBUG
ловушка (запускать перед каждой командой) или, возможно, PROMPT_COMMAND
(запускать перед каждым приглашением).
Ловушка ближе к вашей попытке. Основная концепция изложена вЕсть ли в bash хук, который запускается перед выполнением команды?и существует готовая версия под ключbash-preexec.
По словам автора, bash-preexec используетсяБашхабдля обеспечения «истории bash в облаке», поэтому я уверен, что она справится с задачей «истории bash в файле».
решение2
Вы пытаетесь реализовать что-то эквивалентноеэта "вечная история":
export HISTTIMEFORMAT="%s "
PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND ; }"'echo $$ $USER \
"$(history 1)" >> ~/.bash_eternal_history'
Основная идея заключается в том, что history 1
(в bash) выводится последняя строка, переданная bash.
$ echo "$(history 1)"
12766 2019-05-31T20:14:44+0000 echo "$(history 1)"
Который на самом деле имеет осмысленное значение только внутри скрипта (не в той же строке).
И; PROMPT_COMMAND
выполняет history
команду для каждой новой строки, заданной bash.
На мой взгляд: давать функции имя не очень хорошая идея bash
.