Como ativar o histórico de comandos do ksh entre sessões

2

Se eu iniciar ksh ou mksh , minha seta para cima não fará nada:

$ ksh
$ ^[[A^[[A^[[A^[[A^[[A

Mas funciona com bash se eu iniciar bash e pressionar a seta para cima.

$ bash
developer@1604:~$ ssh [email protected] -p 2223

Eu não tenho histórico se eu começar o ksh ou o mksh. Eu mesmo definir a variável $ HISTFILE e ainda não há histórico se eu começar um novo shell.

O que posso fazer sobre isso? É verdade que o shell Korn não consegue se lembrar do histórico entre as sessões enquanto o shell bash consegue?

Se eu gosto do shell Korn e quero um histórico melhor e mais extenso, é possível usar essa funcionalidade com o ksh?

    
por Niklas Rosencrantz 16.08.2017 / 03:14

3 respostas

2

Não, isso não é verdade.

Se $HISTFILE for um nome de arquivo, o histórico da sessão será armazenado nesse arquivo. Isso é explicado no manual. O número de comandos lembrados no histórico do shell é limitado pelo valor de $HISTSIZE .

Eu acredito que o histórico é liberado para o arquivo após a execução de cada comando, em oposição a bash que libera o histórico para o arquivo quando a sessão do shell termina. Isso pode depender de qual implementação de ksh você está usando.

Defina HISTFILE como um nome de arquivo no seu arquivo ~/.profile (que é lido por shells de login) ou no arquivo apontado por $ENV (que é lido por shells interativos e tem o valor padrão de $HOME/.kshrc em código%). ksh93 é por padrão 500 ou 512 ou algo parecido, dependendo da implementação de $HISTSIZE que você está usando. Nenhuma dessas variáveis precisa ser exportada. O arquivo de histórico não precisa existir antes de fazer isso.

Nos comentários, você menciona que algumas teclas de edição de movimento e linha de comando do Emacs não funcionam. Isso ocorre porque o shell não está no modo de edição do Emacs. Defina a variável ksh (ou EDITOR ) como VISUAL ou use emacs para ativar o modo de edição de linha de comando do Emacs. Isso também é explicado no manual. Essas variáveis também não precisam ser exportadas, a menos que você deseje que outros programas sejam usados pelo shell.

Resumo:

No seu arquivo set -o emacs :

export ENV="$HOME/.kshrc"

No seu arquivo $HOME/.profile :

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

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

Isso foi testado no OpenBSD com $HOME/.kshrc e ksh93 (que é pdksh no OpenBSD). Eu não uso ksh , mas como é um derivado de mksh , acredito que isso funcionaria com essa shell também.

Observação de que pdksh e pdksh (e ksh93 ) não podem compartilhar o arquivo de histórico porque têm formatos de histórico diferentes.

Normalmente, isso não é um problema se você separou arquivos de inicialização para bash e bash , por exemplo, ksh e .bash_profile para .bashrc e bash e .profile para .kshrc (com ksh in export ENV="$HOME/.kshrc" ). Você pode ainda distinguir várias implementações de .profile observando ksh (normalmente).

    
por 16.08.2017 / 09:01
1

Um momento. O KSH, por padrão, não aceita as teclas de setas para percorrer o histórico de comandos.

Veja esta pergunta:

link

Da resposta de Tim:

For the arrow keys, you can put this into your the .kshrc file [(pdksh and mksh both use .mkshrc, not .kshrc)] in your home directory:

set -o emacs
alias __A='echo "0"'     # up arrow = ^p = back a command
alias __B='echo "6"'     # down arrow = ^n = down a command
alias __C='echo "
echo "0"
6"' # right arrow = ^f = forward a character alias __D='echo "
set -o emacs
alias __A='echo "0"'     # up arrow = ^p = back a command
alias __B='echo "6"'     # down arrow = ^n = down a command
alias __C='echo "
echo "0"
6"' # right arrow = ^f = forward a character alias __D='echo "%pre%2"' # left arrow = ^b = back a character alias __H='echo "%pre%1"' # home = ^a = start of line alias __Y='echo "%pre%5"' # end = ^e = end of line
2"' # left arrow = ^b = back a character alias __H='echo "%pre%1"' # home = ^a = start of line alias __Y='echo "%pre%5"' # end = ^e = end of line

Note that there are two underscore characters before the letters on the left side of the equal sign. On the right-hand side of the equal, the goal is to get the proper control character assigned to the alias. The way this script does that, is by running the command (via back-tics)

%pre%

to get the control-n character assigned to __B.

EDIT (obrigado mirabilos): eu removi o material nos backticks enquanto procurava. Eu fui enganado por isso:

Veja link

Verifique se a sua variável $HISTFILE env aponta para um arquivo e você deve estar pronto.

Eu tenho pdksh , da página de manual :

NOTE: if HISTFILE isn't set, no history file is used. This is different from the original Korn shell, which uses $HOME/.sh_history; in future, pdksh may also use a default history file.

Para mksh , é o mesmo :

Note: If HISTFILE isn't set, no history file is used. This is different from AT&T UNIX ksh.

Observe que meus pdksh e meus mksh usam o arquivo $HOME/.mkshrc as .kshrc . Novamente, uma questão de RTFM ( man ksh ), sua implementação pode usar outra. (graças a Kusalananda por sugerir isso).

BTW, você pode converter o histórico do ksh para o bash_history facilmente, usando o comando strings e um sed para organizar, da seguinte maneira:

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

    
por 25.08.2017 / 09:06
1

O que eu acho que está acontecendo é que vindo do bash você está acostumado a usar as setas para acessar os comandos do histórico. Isso, AFAIK, não está habilitado no KSH (a menos que você passe por loops para fazer isso acontecer), a menos que você "defina -o vi", caso em que você pode usar o cursor do vi e teclas de edição de texto, ou seja: < h > esquerda, < j > up, < k > para baixo, < l > certo, < i > para inserir, < x > para apagar um char, < d > < w > para apagar uma palavra, etc, mais detalhes aqui Com tudo isso dito, se você puder ver o histórico de comandos ao executar o comando "history", poderá navegar pelo histórico com a dica acima. No entanto, se o comando "history" não produzir nada, acho que seria outro problema (uma pegadinha comum é a propriedade e permissões do arquivo ".sh_history"). ^ _ ^

    
por 21.09.2018 / 20:17