Создать оболочку вокруг bash с использованием функции bash

Создать оболочку вокруг bash с использованием функции bash

Я немного опасаюсь возиться с настройками истории 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.

Связанный контент