Чтобы не регистрировать «опасные» команды в истории bash, я добавил в свой .bashrc
файл следующую строку :
HISTIGNORE='rm *:mv *:cp *:cat*>*:pv*>*'
это хорошо работает, но имеет побочный эффект: я не вижу полной истории команд, выполняемых на машине. Допустим, у меня есть несколько машин для экспериментов, и я хочу видеть все выполненные команды. Я бы использовал внутренний bash history
для отображения выполненных команд и, возможно, grep для сегодняшней даты:
history | grep Sep-28
То, что я хотел бы сделать, - это также регистрировать «опасные» команды, но ставить #
в начале строки, чтобы, если мне случится выполнить команду из истории по ошибке, никакого ущерба не будет.
Я понятия не имею, возможно ли это.
Обновление и уточнение:
Основная причина, по которой это является проблемой для меня, заключается в том, что я обычно подключаюсь к своей машине с нескольких терминалов, и любая команда, выполняемая на одном терминале, немедленно считывается в историю других терминалов. Это достигается
PROMPT_COMMAND="history -a; history -c; history -r"
Давайте представим, что у меня два открытых терминала. В одном у меня cat /dev/foo > file.out
запущен какой-то процесс. Во втором я проверяю прогресс с ls -lAhF
. Я продолжаю повторять ls
, нажимая Upи ENTER(то есть последнюю команду из истории). Как только первая команда заканчивается, последней команды из истории больше нет ls
, но cat /dev/foo > file.out
. Если я не буду осторожен, я начну cat снова и перезапишу file.out.
Я хотел бы добиться, чтобы команде cat предшествовала буква a #
, чтобы она не выполнялась. Я, однако, все еще вижу это в истории и могу использовать его повторно (если это длинная команда), не комментируя его.
источник
watch ls -lAhF
илиwhile sleep 1; do ls -lAhf; done
; вместо просмотра размера файла вы можете использоватьpv /dev/foo > file.out
( ivarch.com/programs/pv.shtml ).Ответы:
Вы могли бы сделать что-то вроде:
Идея состоит в том, что перед каждым приглашением мы проверяем последнюю запись в истории (
history 1
) и, если она является одной из опасных , мы удаляем ее (history -d
) и добавляем обратно с помощью#
withhistory -s
.(очевидно, вам нужно удалить
HISTIGNORE
настройки).Нежелательный побочный эффект , что , однако, что он изменяет время истории тех
rm
,mv
... команды.Чтобы это исправить, альтернативой может быть:
На этот раз мы записываем время последней истории, и чтобы добавить обратно строку истории, мы используем
history -r
временный файл (документ здесь), который включает метку времени.Вы хотели бы,
fixhist
чтобы было выполнено перед вашимhistory -a; history -c; history -r
. К сожалению, в текущей версииbash
есть ошибка,history -a
которая не сохраняет добавленную нами дополнительную строку. Обходной путь - написать вместо этого:То есть добавить комментируемую команду к HISTFILE самостоятельно, вместо того, чтобы позволить
history -a
ей это сделать.источник
cmd=${cmd#*[0-9] }
делает? И где именно я должен положитьfixhist
в мойPROMPT_COMMAND
? На данный момент он уже содержитPROMPT_COMMAND="history -a; history -c; history -r"
HISTTIMEFORMAT=/
? Я уже установилexport HISTTIMEFORMAT="%b-%d %H:%M "
. Кстати, когда я добавляю твой код в мой$HOME/.bashrc
, ничего не происходит.HISTTIMEFORMAT=/
только для этого одного вызова,history
чтобы получить вывод, например,123 /rm x
где легче извлечь cmd. Возникла проблема с некоторыми версиями того,bash
где$HISTCMD
в этом контексте была фальшива, попробуйте новую версию.#
в коде не действуют как комментарии в.bashrc
?bash
вставляет*
после номера истории, который не ожидался. Должно быть исправлено сейчас.Я не собираюсь точно отвечать на ваш вопрос, но, возможно, дам вам альтернативное решение вашей проблемы.
Если я правильно понимаю, вы обеспокоены ошибками, которые вы могли бы совершить, набрав, например,
!rm
если это случилось, что предыдущаяrm
команда в истории удаляет то, что вы хотели бы сохранить.В этом случае хорошим вариантом bash является
histverify
. Если выshopt -s histverify
, и если вы вспомните команду с ударом!
, она не будет выполнена немедленно, но будет загружена в readline, так что вы можете решить, выполнять ее или нет, и это также дает вам возможность редактировать ее.Попытайся:
Без
histverify
:С
histverify
:В этом случае у вас будет курсор в конце строки, готовый запустить его снова - или нет - или отредактировать.
Если вам нравится эта опция, поместите ее в
.bashrc
:источник