É possível ter um único histórico de comandos que seja compartilhado entre todos os shells?
Acho que, por padrão, o histórico é substituído pelo shell que sai primeiro. Antes eu fiz coisas onde cada shell tem um "nome" e seu próprio arquivo de histórico, mas meu uso de shells é um pouco mais leve hoje em dia, então parece um exagero.
Atualizações
Parece que eu não habilitei o incappendhistory:
> setopt | grep inc
A execução setopt incappendhistory
corrigiu isso. Pude então ver, olhando para o arquivo de histórico, que esses arquivos foram anexados imediatamente.
No entanto, esse histórico só parece estar disponível para outros shells depois que um novo shell é aberto (o que provavelmente é o comportamento que procuro). Configuração sharedhistory
com setopt
comandos feitos em outros shells imediatamente disponíveis. Na verdade, não acho que seja isso que estou procurando - já que ter um histórico distinto em diferentes shells é útil. Só não quero perder a história.
Primeiro, por padrão, o zsh não salva o histórico de comandos. Você precisa definir
HISTFILE
o caminho para o arquivo onde deseja salvar o histórico eSAVEHIST
o número de linhas que deseja salvar. Veja o histórico de comandos no Zsh . No restante desta resposta, assumirei que o histórico está sendo salvo e discutirei quando ele for salvo e carregado.Por padrão, o zsh carrega o histórico quando inicia e o salva quando sai. Ao salvar o histórico, ele anexa o histórico da sessão atual ao arquivo de histórico. Portanto, nenhum histórico é perdido, mesmo quando há sessões simultâneas (até que o arquivo de histórico atinja 1,2 vezes
$SAVEHIST
as linhas, ponto em que o zsh cortará o arquivo). A principal vantagem dessa abordagem é que as linhas de uma sessão permanecem agrupadas. Uma desvantagem é que as linhas da sessão A só aparecerão nas sessões iniciadas após a saída da sessão A. Outra desvantagem é que, se sua máquina (ou zsh) travar, o histórico será perdido (mas o histórico será salvo se o terminal simplesmente desaparecer, por exemplo, porque uma conexão SSH morre devido a um problema de rede).Se você ativar a
share_history
opção, o zsh salvará cada linha do histórico assim que for inserida e carregará novas linhas do histórico assim que estiverem disponíveis. (Ou mais precisamente, antes de exibir um novo prompt; o zsh não lerá o histórico enquanto você estiver editando uma linha de comando.) A principal vantagem é que as linhas do histórico estão disponíveis imediatamente em todas as sessões. A principal desvantagem é que as linhas de sessões diferentes acabarão misturadas, de modo que as linhas consecutivas no histórico podem não fazer sentido umas em relação às outras.Existem também as opções
inc_append_history
einc_append_history_time
. Eles fazem com que o zsh salve o histórico assim que executa cada comando, mas ele não lê as novas linhas do histórico automaticamente (exceto quando é iniciado, é claro). A_time
variante salva o histórico depois de executar um comando, em vez de antes, o que permite que o zsh economize o tempo que levou para ser executado.Você pode desativar a
append_history
opção e o zsh substituirá o arquivo de histórico ao salvá-lo, em vez de anexá-lo. Como consequência, se você iniciar a sessão A, iniciar a sessão B, sair de A e sair de B, o histórico de A será perdido. Não consigo pensar em uma boa razão para escolher esse comportamento (mas é o padrão do bash).Você pode importar novas linhas do arquivo de histórico a qualquer momento executando
fc -RI
. Isso é útil se você não usarshare_history
, para importar explicitamente o histórico de outras sessões de tempos em tempos.Você pode salvar novas linhas no histórico a qualquer momento executando
fc -AI
. Isso é útil se você não usarinc_append_history
oushare_history
, para exportar explicitamente o histórico da sessão atual de tempos em tempos.O que descrevi como padrões nesta resposta são os padrões zsh. Algumas distribuições e a maioria das estruturas de configuração do zsh pelo menos habilitarão o histórico por padrão e podem alterar algumas opções relacionadas ao histórico.