Временно приостановить bash_history на данной оболочке?

116

Есть ли способ временно приостановить отслеживание истории в bash, чтобы войти в своего рода режим «инкогнито»? Я ввожу в свой терминал информацию, которая не нужна для записи конфиденциальной финансовой информации.

Нафтули Кей
источник

Ответы:

153

Это должно быть то, что вы ищете:

unset HISTFILE

Из man bash

Если HISTFILE не установлен или файл истории недоступен для записи, история не сохраняется.

В качестве альтернативы, если вы хотите выключить, а затем снова включить, это может быть проще в использовании set:

Выключи

set +o history

Включи

set -o history
SiegeX
источник
12
Значение HISTFILEпроверяется только при выходе из bash, поэтому первый метод не работает как есть (если вы восстановите значение, команда будет сохранена). set +o historyработает как указано.
Жиль
6
Спасибо отлично Я буду использовать set +o historyи set -o historyдля переключения назад и вперед, когда я делаю секретные вещи;)
Нафтули Кей
1
unset HISTFILEне работает. set -/+o historyработает как шарм! спасибо
холофело малома
4
В качестве подсказки, если вы поставите пробел перед командой (запустите команду с пробелом), она не будет записана в вашей истории, и клавиши со стрелками вверх / вниз также не покажут ее.
Махди
1
Это не сработает в zsh btw
Shubham Chaudhary
33

Используя bash, установите HISTCONTROL="ignorespace"и поставьте перед пробелом любую команду, которую вы не хотите записывать в историю. В случае, если вы забыли принять какие-либо меры, есть также history -d <number>для удаления конкретной записи или history -cдля очистки всей истории команд.

forcefsck
источник
27

Убедитесь, что HISTCONTROLсодержит ignorespace. Возможно, вы захотите добавить HISTCONTROL=ignorespace( HISTCONTROL=ignoredups:ignorespaceили что-то) к вашему ~/.bashrc. Тогда любая командная строка, которая начинается с пробела, исключается из истории.

Другая возможность - начать новый сеанс bash, который не сохраняет его историю.

$ bash
$ unset HISTFILE
$ sooper-sekret-command
$ exit
$ #back in the parent shell
жилль
источник
5

Если вам нужно избежать сохранения нескольких команд и вы все еще хотите использовать стрелку вверх для доступа к предыдущим командам, используйте:

$ bash                        # open a new session.
$ unset HISTFILE              # avoid recording commands to file.
$ commands not recorded
.
.
$ exit
$

Существует четыре способа (уровня) управления хранением команд.

  1. Первый и ignorespaceсамый простой - использовать (или игнорировать):

    $ HISTCONTROL="ignorespace${HISTCONTROL:+:$HISTCONTROL}"

    Это позволит использовать пробел перед командами, которые вы хотите избежать записи в списке памяти history. И, как следствие, поскольку в памяти нет записанной команды, которая могла бы быть отправлена ​​в файл, также будет исключена отправка одной команды в файл, указанный в $HISFILE.

  2. Избегайте записи команд в файл в $HISTFILE:

    $ unset HISTFILE

    Если не установлено, история команд не сохраняется при выходе из оболочки.

    Null HISTFILE=''и / или установлен на HISTFILE=/dev/nullработает с тем же эффектом. Поймите, что команды все еще записываются в список памяти, попробуйте historyкоманду или стрелку вверх.

    Предупреждение: если HISTFILE сбрасывается до того, как оболочка существует, все, что было записано в памяти, все равно может быть записано в файл.

  3. Избегайте записи новых команд в список истории в памяти. И, как не будучи в памяти, не может быть записано в файл.

    $ shopt -ou history              # or set +o history

    Повторно включить с shopt -os history(или set -o history)

  4. Удалите все команды из списка истории в памяти:

    $ HISTSIZE=0

    Все команды удаляются (из памяти), и, следовательно, ничто не может быть сохранено в файл, конечно, пока переменная не будет снова установлена ​​в какое-либо действительное числовое значение.

Исаак
источник
// Это охватывает все ответы, кроме ответа от @Ambrose на одной удобной странице. Путь, @ Исаак. Вы бы хотели добавить ссылку или две в документы для этого? Уверен, что man historyэто не удастся большинству из нас.
Натан Басанезе
1
@NathanBasanese Расширено. Лучше?
Исаак
// , Да! Буду ли я прав, предполагая, что они взяты из переменных Bash и встроенных документов Shopt ?
Натан Басанезе
//, Кроме того , в то время как я читал переменные документации Bash , я наткнулся HISTIGNORE, что subsumesфункция HISTCONTROL.
Натан Басанезе
(Предполагая, что вы используете Linux): Что произойдет, если вы выполните команду LESS=+'/^ *HISTI' man bash(не так ли это «страницы руководства»?). @NathanBasanese
Исаак
3

Существует один простой способ отключить историю, поэтому команды не будут сохраняться в .bash_historyфайле.

Вы должны поместить пробел или символ табуляции перед любой командой, чтобы эта команда не сохранялась в истории. Например:

$ ls 
print the list of file 
$ history 
ls
history

$  pwd
print the current  working directory 
$ history 
ls
history

Команда pwdне будет сохранена в истории, потому что она имеет пробел в передней части.

Каланидхи М.
источник
Это не работает; Bash жалуется, что '-' или '-history', или другие переносимые команды не могут быть найдены.
Самуил А. Фальво II
2
Это не сработает, если только HISTCONTROL = "ignorespace" не установлен как в ответе forcefsck
DeveloperChris
1
export HISTFILE=/dev/null 

Это мой путь. На случай, если неустановленный HISTORY / HISTFILE / HISTCONTROL и т. Д ... не работает, экспорт его в / dev / null всегда работал для меня.

Эмброуз
источник
Для временно приостановленной истории? Это не сработало для меня как для обычной команды. Последующие команды были записаны в историю. Вы называете это в .bash_profile или в скрипте? GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin16)
Мат Гессель