Однострочная версия
Вот однострочная версия. Это оригинал. Я также опубликовал короткую версию функции и длинную версию функции с несколькими добавленными функциями. Мне нравятся версии функций, потому что они не будут поглощать другие переменные в вашей среде, и они намного более читабельны, чем однострочные. В этом посте содержится некоторая информация о том, как все они работают, которые не могут дублироваться в других.
Добавьте в файл ~/.bashrc
следующее:
export PROMPT_COMMAND='hpwd=$(history 1); hpwd="${hpwd# *[0-9]* }"; if [[ ${hpwd%% *} == "cd" ]]; then cwd=$OLDPWD; else cwd=$PWD; fi; hpwd="${hpwd% ### *} ### $cwd"; history -s "$hpwd"'
Это делает запись в истории, которая выглядит следующим образом:
rm subdir/file ### /some/dir
Я использую ###
в качестве разделителя комментариев, чтобы отделить его от комментариев, которые может вводить пользователь, и уменьшить вероятность коллизий при удалении старых комментариев к путям, которые в противном случае накапливались бы при нажатии клавиши ввода в пустой командной строке. К сожалению, побочным эффектом является то, что команда типа echo " ### "
искажается, хотя это должно быть довольно редко.
Некоторые люди сочтут тот факт, что я использую одно и то же имя переменной, неприятно. Обычно я бы не стал, но здесь я пытаюсь свести к минимуму след. Это легко изменить в любом случае.
Это слепо предполагает, что вы не используете HISTTIMEFORMAT
или не изменяете историю каким-либо другим способом. Было бы легко добавить команду date
в комментарий вместо функции HISTTIMEFORMAT
. Однако, если вам нужно использовать его по какой-то причине, он все еще работает в подоболочке, так как он автоматически сбрасывается:
$ htf="%Y-%m-%d %R " # save it for re-use
$ (HISTTIMEFORMAT=$htf; history 20)|grep 11:25
Есть пара очень маленьких проблем с этим. Один из них, если вы используете команду history
, например, такую:
$ history 3
echo "hello world" ### /home/dennis
ls -l /tmp/file ### /home/dennis
history 3
Результат не будет отображать комментарий к самой команде history
, даже если вы увидите его, если нажмете стрелку вверх или введете другую команду history
.
Другое - команды со встроенными символами новой строки оставляют некомментированную копию в истории в дополнение к закомментированной копии.
Могут появиться другие проблемы. Дайте мне знать, если найдете.
Как это работает
Bash выполняет команду, содержащуюся в переменной PROMPT_COMMAND
, каждый раз, когда выдается первичное приглашение PS1
. Этот маленький скрипт использует эту возможность, чтобы захватить последнюю команду в истории, добавить комментарий и сохранить ее обратно.
Здесь он разбит на части с комментариями:
hpwd=$(history 1) # grab the most recent command
hpwd="${hpwd# *[0-9]* }" # strip off the history line number
if [[ ${hpwd%% *} == "cd" ]] # if it's a cd command, we want the old directory
then # so the comment matches other commands "where *were* you when this was done?"
cwd=$OLDPWD
else
cwd=$PWD
fi
hpwd="${hpwd% ### *} ### $cwd" # strip off the old ### comment if there was one so they
# don't accumulate, then build the comment
history -s "$hpwd" # replace the most recent command with itself plus the comment