Это раньше имело место и вероятно все еще имеет место, что, когда стандартный вывод записан в терминал, это - строка, буферизованная по умолчанию - когда новая строка записана, строка записана в терминал. Когда стандартный вывод отправляется в канал, он полностью буферизуется - таким образом, данные только отправляются в следующий процесс в конвейере, когда стандартный буфер ввода-вывода заполнен.
Это - источник проблемы. Я не уверен, существует ли очень, можно сделать для фиксации его, не изменяя программу, пишущую в канал. Вы могли использовать setvbuf()
функция с _IOLBF
отметьте для безусловного помещения stdout
в строку буферизовал режим. Но я не вижу простой способ осуществить это на программе. Или программа может сделать fflush()
в соответствующих точках (после каждой строки вывода), но тот же комментарий применяется.
Я предполагаю, что при замене канала псевдотерминалом, затем стандартная библиотека I/O думала бы, что вывод был терминалом (потому что это - тип терминала), и выровнял бы буфер автоматически. Это - сложный способ иметь дело с вещами, все же.
В ZSH:
Сначала вставьте setopt HIST_IGNORE_SPACE
к Вашему ~/.zshrc
. Теперь после входа в систему снова можно снабдить префиксом любые команды, которые Вы не хотите снабженный в истории a space
.
Из руководства пользователя следующие 3 опции могут использоваться, чтобы сказать, что определенные строки не должны входить в историю вообще:
При выполнении команды много раз Вы могли бы хотеть использовать историю своей оболочки, игнорируют функцию. Позволяет говорят, что у Вас есть 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
и даже клавиша со стрелкой вверх, которая обычно повторно вызывает Вашу предыдущую команду, не будет работать, если она будет соответствовать Вашему шаблону.
HISTIGNORE="^fortune*"
проигнорировать fortune -l
но сохраните myfortune
?
– Bernhard
26.10.2012, 12:18
В ударе используйте HISTCONTROL
переменная.
Установите его на HISTCONTROL=ignorespace
(или HISTCONTROL=ignoreboth
). С этого времени при начале строки с пространства это не будет сохранено в истории. Это старается не включать not-to-be-disclosed-command в некоторый конфигурационный файл.
Даже как этот это, оказывается, забывает добавлять пространство и затем хотеть возвратиться. Для удаления записи в истории использовать history -d <index>
, с index
число, найденное с history
команда (первый столбец).
Самый легкий путь к одноразовому
$ $SHELL
$$ unset HISTFILE
$$ secret-command
$$ exit
$
где $
представляет подсказку начальной оболочки и $$
представляет подсказку подоболочки. Это работает в ударе и zsh; в ksh Вам нужно HISTFILE=/notwritable
вместо этого. Обратите внимание, что то, что имеет значение, является значением HISTFILE
когда файл истории записан, не, когда команда выполняется. Bash, ksh и zsh пишут в файл истории, когда они выходят (zsh, может делать это чаще в зависимости от конфигурации).
С другой стороны, можно заставить удар или zsh игнорировать строки, соответствующие определенным шаблонам (это уже охвачено другими ответами).
Другая возможность в zsh
% fc -p
% secret-command
% fc -P
fc -p
продвигает текущий список предыстории на стек и запускает новый, который не связан с сохранить файлом. fc -P
выталкивает тот несохраненный список предыстории от стека и забывает об этом в целом.
В то время как процесс работает, команда и ее аргументы (и в некоторых системах ее среда также) обнаружатся в таблице процессов (ps
вывод). Root видит прошлые команды в базе данных учета системных ресурсов и может сделать больше входа без Вашего управления. И вероятно, будут все виды данных судебной экспертизы, которые могут показать примерно, что управляет, чтобы Вы работали (такие как время изменения файла). Таким образом, Вы не получаете конфиденциальность против решительных соглядатаев.
| somecommand
– xenoterracide 19.01.2011, 12:57preexec
это может использоваться для этого. Если это возвращается ненулевой, команда не сохраняется в истории. – Keith 19.01.2011, 16:20setopt HIST_IGNORE_SPACE
в~/.zshrc
– Al.G. 06.04.2016, 20:27