Как иметь отдельную историю команд для разных сессий для одного и того же пользователя?

8

Я сталкиваюсь с этой проблемой на некоторых серверах Unix. Когда я открываю другой сеанс для одного и того же пользователя, история команд используется всеми сеансами. Это создает проблемы, если по ошибке я нажимаю Ctrl-Pили up arrowи просто нажимаю Enter. Однажды я, к rm -rf *счастью, побежал в каталог, где у меня нет прав на удаление файлов.

Как иметь отдельную историю команд для разных сессий для одного и того же пользователя? Большую часть времени я использую оболочки ksh и tcsh.

Hemant
источник

Ответы:

8

Из часто задаваемых вопросов по ksh :

Q1. Как получить отдельные файлы истории для оболочки?

A1. ksh использует файл общей истории для всех оболочек, которые используют одно и то же имя файла истории. Это означает, что команды, введенные в одном окне, будут видны оболочками в других окнах. Чтобы получить отдельные окна, переменная HISTFILE должна иметь другое имя перед созданием первой команды истории.

theotherreceive
источник
11

Вы можете добавить HISTFILE=~/.hist$$в свой .profile. Это должно генерировать уникальный файл за сеанс.

В итоге у вас будет большое количество, .hist*поэтому я предлагаю вам время от времени удалять их.

Герт
источник
2

Я предполагаю, что вы говорите об одновременных сессиях; разделять сессии друг за другом не очень полезно: вы больше никогда не сможете использовать их историю, потому что все сессии будут уникальными. Если бы это было так, вам, вероятно, было бы лучше просто отключить историю команд.

Если мы говорим о разделении одновременной сессии, я бы рекомендовал вам использовать Bash. Я почти уверен, что не получаю историю команд из двух одновременных сессий, смешанных с ней. Bash записывает историю только .bash_historyпри выходе из системы, поэтому история команд не будет смешана до выхода из системы. При условии, что использование Bash приемлемо, решит ли это вашу проблему?

wzzrd
источник
Спасибо за ответ. Я работаю над HP-UX, и на нем не установлен bash, и у меня нет разрешения на его установку :(.
Hemant
1

Я добавлю кое-что к ответу Герта.

Герт-х

Вы можете добавить HISTFILE = ~ / .hist $$ в свой .profile. Это должно генерировать уникальный файл за сеанс.

Моя

Вы можете удалить эти файлы автоматически, добавив следующее.

trap 'rm ${HISTFILE}' exit

Роберт Джейкобс
источник
2
Будьте осторожны с выходными ловушками - оболочка их не складывает, как вы могли бы надеяться, поэтому любые дальнейшие настройки выходной ловушки перезаписывают все предыдущие. Я написал накопитель для ловушек, но он чуть не взорвал все, что у меня было.
Дэвид
-1

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

xenoterracide
источник
Я не могу установить экран. это даже не компилируется на моем сервере.
Hemant
Я не уверен, как экран даст вам такую ​​возможность
Майкл Мрозек
@ Майкл, у вас могут быть разные сессии с экраном, и у экрана есть своя история. Я не знаю, кто-то сказал мне, чтобы решить мою проблему с экраном ... Мне не понравился экран. Хм, что это было урезано, когда мой второй ответ по существу такой же, как и у других, которые были изменены. @ Хемант ... а я должен был это знать? Я не использую экран, чтобы сделать это в моей системе. Я просто знаю, что это позволяет сделать подобный эффект правильно.
ксенотеррацид
Я думаю, я знаю, что вы описываете, но это не функция экрана, это просто побочный эффект от работы оболочек. Если вы откроете две оболочки, команды, введенные в одной, не будут отображаться в истории другого, если только оболочка не поддерживает их специально (например, ZSH, но вам нужно явно включить их). Он не хранит отдельные истории, они оба записывают в основной файл истории, вы просто не можете видеть изменения в каждой оболочке, потому что обычно оболочки не проверяют изменения файла истории после загрузки
Майкл Мрозек
@MichaelMrozek У оболочки korn есть одна общая история для всех окон, это нельзя отключить. Использование screenне поможет вообще.
FUZxxl