Есть ли способ предотвратить добавление команды в вашу историю?

65

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

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

xenoterracide
источник
перекрестная ссылка на zsh ответ: superuser.com/questions/352788/…
Михаил Шигорин

Ответы:

52

В ЗШ :

Сначала вставьте setopt HIST_IGNORE_SPACEв свой ~/.zshrc. Теперь после того, как вы снова войти в систему , вы можете префикс любые команды , которые вы не хотите хранить в истории с space.

Из руководства пользователя следующие 3 опции могут использоваться, чтобы сказать, что определенные строки вообще не должны входить в историю:

  • HIST_IGNORE_SPACE не хранит команды с префиксом пробела
  • HIST_NO_STORE не хранить команду истории ( fc -l )
  • HIST_NO_FUNCTIONS не хранит определения функций
кендырь
источник
Есть ли шанс, что @mmckinst ответ работает в Zsh? или как то так? или, может быть, любая команда, которая включает команду| somecommand
xenoterracide
AFAIK, нет эквивалента HISTIGNORE от bash в zsh.
Догбейн
@xeno zsh предоставляет функцию ловушки, preexecкоторую можно использовать для этого. Если он возвращает ненулевое значение, команда не сохраняется в истории.
Кит
1
чтобы zsh игнорировал кучу основных общих команд, я назначил им всем псевдонимы, чтобы они имели пробел впереди ... для c (ls fg bg jobs завершить сброс настроек); сделать псевдоним $ c = "$ c"; сделано
Уилл Норрис
4
Для ленивых будущих читателей , как я , которые не знают , как это сделать еще: setopt HIST_IGNORE_SPACEв~/.zshrc
Al.G.
25

Если вы запускаете команду снова и снова, вы можете использовать функцию игнорирования истории вашей оболочки. Допустим, у вас есть secret.server.com, к которому вы обращаетесь по ssh, FTP-файлы и т. Д., И вам не нужна ни одна строка, в которой упоминается secret.server.com:

В bashтебе бы поставили

HISTIGNORE="*secret.server.com*"

тогда как в zshпараметре называется

HISTORY_IGNORE="*secret.server.com*"

Вы можете перечислить несколько шаблонов с двоеточием, разделяющим их. Обратите внимание, что каждый шаблон сопоставляется с полной строкой ввода , поэтому вам может потребоваться включить *. Например, следующее исключит fortuneиз истории, но сохранит fortune -l:

HISTIGNORE="*secret.server.com*:ytalk*:fortune"
HISTORY_IGNORE="*secret.server.com*:ytalk*:fortune"

С установленным HISTIGNORE ничто, соответствующее шаблонам, которые вы перечисляете, не будет сохранено в .bash_history/ .zsh_historyи даже клавиша со стрелкой вверх, которая обычно вызывает вашу предыдущую команду, не будет работать, если она соответствует вашему шаблону.

Марк Маккинстри
источник
3
Есть ли шанс, что это работает в Zsh?
ксенотеррацид
Есть ли возможность игнорировать только строки, начинающиеся с удачи. Нечто подобное HISTIGNORE="^fortune*"игнорировать, fortune -lно держать myfortune?
Бернхард
@xenoterracide Да, но параметр назван по-другому. Я просто отредактировал это в ответ.
n.st
23

В bash используйте HISTCONTROLпеременную.

Установите его в HISTCONTROL=ignorespace(или HISTCONTROL=ignoreboth). С этого момента, когда вы начинаете строку с пробела , она не будет сохранена в истории. Это позволяет избежать включения команды «не подлежит раскрытию» в некоторый файл конфигурации.

Даже так бывает, что забывают добавить пробел, а затем хотят вернуться. Чтобы удалить запись в истории, использовании history -d <index>, с indexчислом найденных с помощью historyкоманды (первая колонка).

shellholic
источник
1
Это работает в zsh?
Герт
11

Самый простой способ для одноразового использования

$ $SHELL
$$ unset HISTFILE
$$ secret-command
$$ exit
$

где $представляет подсказку начальной оболочки и $$представляет подсказку подоболочки. Это работает в bash и zsh; в кш вам нужно HISTFILE=/notwritableвместо. Обратите внимание, что значение имеет значение, HISTFILEкогда записывается файл истории, а не когда запускается команда. Bash, ksh и zsh записывают в файл истории при выходе (zsh может делать это чаще в зависимости от конфигурации).

Кроме того, вы можете использовать bash или zsh, чтобы игнорировать строки, соответствующие определенным шаблонам (это уже охватывается другими ответами).

Другая возможность в Zsh

% fc -p
% secret-command
% fc -P

fc -pпомещает текущий список истории в стек и запускает новый, который не связан с файлом сохранения. fc -Pвытаскивает этот несохраненный список истории из стека и вообще забывает об этом.

Во время выполнения процесса команда и ее аргументы (а также в некоторых системах ее окружение) будут отображаться в таблице процессов ( psвывод). Root может видеть прошлые команды в базе данных системного учета и может делать больше регистрации без вашего контроля. И, вероятно, будут все виды судебных доказательств, которые могут приблизительно показать, какую команду вы выполняли (например, время изменения файла). Таким образом, вы не получите конфиденциальность против решительных подслушивающих.

Жиль "ТАК - перестань быть злым"
источник