Как включить историю команд ksh между сеансами

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

bash -c "sleep 30; xmodmap ~ / Documents / loadScripts / Xmodmap"

вместо задержки. Однако это не очень элегантно, так как я понятия не имею, почему это работает. Таким образом, я надеюсь принять ответ, который будет немного менее сложным.

3
21.09.2018, 21:40
3 ответа

Нет, это неправда.

Если $HISTFILEявляется именем файла, то история сеанса будет храниться в этом файле. Это объясняется в руководстве. Количество команд, запоминаемых в истории оболочки, ограничено значением $HISTSIZE.

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

Установите HISTFILEна имя файла в вашем ~/.profileфайле (, который читается оболочками входа в систему ), или в файле, на который указывает $ENV(, который читается интерактивными оболочками и имеет значение по умолчанию. из $HOME/.kshrcвksh93). $HISTSIZEпо умолчанию 500 или 512 или около того, в зависимости от используемой вами реализации ksh. Ни одну из этих переменных не нужно экспортировать. Файл истории не обязательно должен существовать перед этим.


В комментариях вы упомянули, что некоторые клавиши перемещения Emacs и редактирования в командной строке не работают. Это потому, что оболочка не находится в режиме редактирования Emacs. Либо установите для переменнойEDITOR(илиVISUAL)значение emacs, либо используйте set -o emacs, чтобы включить режим редактирования командной строки Emacs. Это также объясняется в руководстве. Эти переменные также не нужно экспортировать, если только вы не хотите, чтобы их использовали другие программы, кроме оболочки.


Резюме:

В вашем $HOME/.profileфайле:

export ENV="$HOME/.kshrc"

В вашем $HOME/.kshrcфайле:

HISTFILE="$HOME/.ksh_history"
HISTSIZE=5000

export VISUAL="emacs"
export EDITOR="$VISUAL"
set -o emacs

Это было тщательно протестировано на OpenBSD как с ksh93, так и с pdksh(, то есть kshна OpenBSD ). Я не использую mksh, но поскольку это производная от pdksh, я думаю, что это будет работать и с этой оболочкой.

Обратите внимание , что pdksh,ksh93bash)не могут совместно использовать файл истории , так как они имеют разные форматы истории.

Обычно это не проблема, если у вас есть отдельные файлы инициализации для bashи ksh, например. .bash_profileи .bashrcдля bashи .profileи .kshrcдляkshexport ENV="$HOME/.kshrc"в .profile). Вы можете дополнительно различать различные kshреализации, взглянув на$KSH_VERSION(обычно ).

7
27.01.2020, 21:12

Один момент. KSH по умолчанию не принимает клавиши со стрелками для перебора истории команд.

См. этот вопрос:

https://stackoverflow.com/questions/1623256/make-arrow-and-delete-keys-work-in-kornshell-command-line

Из ответа Тима:

Для клавиш со стрелками вы можете поместить это в свой файл .kshrc [( pdkshи mkshоба используют .mkshrc, а не .kshrc )] в вашем домашнем каталоге:

set -o emacs
alias __A=`echo "\020"`     # up arrow = ^p = back a command
alias __B=`echo "\016"`     # down arrow = ^n = down a command
alias __C=`echo "\006"`     # right arrow = ^f = forward a character
alias __D=`echo "\002"`     # left arrow = ^b = back a character
alias __H=`echo "\001"`     # home = ^a = start of line
alias __Y=`echo "\005"`     # end = ^e = end of line

Обратите внимание, что перед буквами слева от знака равенства есть два символа подчеркивания. В правой части равенства цель состоит в том, чтобы получить правильный управляющий символ, назначенный псевдониму. Способ, которым этот сценарий делает это, заключается в запуске команды (через обратные тики)

echo "\020"

, чтобы получить символ управления-n, назначенный на __B.

РЕДАКТИРОВАТЬ (спасибо, mirabilos): я удалил материал с обратных кавычек во время поиска. Я был введен в заблуждение этим:

См. https://stackoverflow.com/questions/9449778/what-is-the-benefit-of-using-instead-of-backticks-in-shell-scripts

Убедитесь, что ваша переменная $HISTFILEenv указывает на файл, и все готово.

У меня есть pdksh, из справочной страницы :

ПРИМЕЧАНИЕ: если HISTFILE не установлен, файл истории не используется. Это отличается от исходной оболочки Korn, в которой используется $HOME/.sh_history; в будущем pdksh может также использовать файл истории по умолчанию.

Для mkshэто тот же:

Примечание: Если HISTFILE не установлен, файл истории не используется. Этот отличается от AT&T UNIX ksh.

Обратите внимание, что мой pdkshи мой mkshиспользуют $HOME/.mkshrcкак файл .kshrc. Опять же, вопрос о RTFM ( man ksh), ваша реализация может использовать другую. (спасибо Кусалананде за намек на это).

Кстати, вы можете легко преобразовать историю ksh в bash_history, используя команду stringsи sed для очистки следующим образом:

strings | sed 's/^[ \t]*//' >> $HOME/bash_history

1
27.01.2020, 21:12

Я думаю, что происходит то, что из bash вы привыкли использовать стрелки для доступа к командам истории. Это, AFAIK, не включено в KSH (, если вы не пройдете циклы, чтобы это произошло ), если вы не «установите -o vi», и в этом случае вы можете использовать перемещение курсора vi и клавиши редактирования текста, т.е. : влево, вверх, вниз, вправо, для вставки, для удаления символа, для удаления слова и т. д., подробнее здесь С учетом всего сказанного, если вы видите историю команд при запуске команды «history», вы должны иметь возможность просматривать историю с помощью приведенного выше совета. Однако, если команда «история» ничего не выводит,это, я думаю, будет еще одной проблемой (распространенной ошибкой является право собственности и разрешения файла.sh _history ). ^ _^

1
27.01.2020, 21:12

Теги

Похожие вопросы