local do arquivo do histórico de saída do shell bash

13

Onde o shell bash armazena a sessão real do terminal? Eu quero ler a saída dos comandos que eu usei antes. Tudo o que posso encontrar no Google é como armazenar a saída de um comando.

Como a saída é exibida na tela, ela deve ser armazenada em algum lugar de qualquer maneira. Então, minha pergunta é: onde?

Daniel Böckenhoff
fonte

Respostas:

11

O Bash armazena apenas o histórico dos comandos executados (que você pode recuperar digitando history). A menos que você já tenha definido o retorno com um número muito alto, não há como ver as saídas mais antigas que o valor definido do retorno. A configuração desse valor para um número muito alto tornará a rolagem lenta, pois as linhas são armazenadas na memória .

Para armazenar seus futuros comandos e suas saídas, existem poucas opções:

Usando screen

Inicie uma sessão na tela digitando screen. Uma vez que você está dentro da tela, pressione Ctrl- ae, em seguida :, em seguida, digite log. Todas as E / S serão capturadas nos screenlogarquivos no diretório em que você iniciou o screencomando.

Usando script

Você pode começar digitando script. Será iniciada uma sessão de script que capturará toda a E / S em um arquivo chamado typescript. Você pode sair da scriptsessão por Ctrl- d e visualizar os logs no typescriptarquivo.

Usando tee

tee é uma ferramenta útil. Você pode fazer algo assim:

$ bash | tee log.txt

Isso abrirá um novo shell bash dentro do que você já está executando. Quando você exitsair disso, poderá ver as saídas no arquivo chamadolog.txt

Outras maneiras

Como Dustin Kirkland sugeriu neste post, você também pode usar o byobu . Embora eu nunca tenha usado, ferramentas de screencasting de terminal como o Shelr também parecem uma opção.

Ron
fonte
6

Há muitas perguntas relacionadas a essa, mas todas começam com a suposição (correta) de que a saída não está registrada.

Então, minha pergunta é: onde?

Em nenhum lugar: a saída do Bash (e qualquer outro shell que eu conheça) não está registrada.

Como a saída é exibida na tela, ela deve ser armazenada em algum lugar de qualquer maneira.

É, mas provavelmente não em texto simples e nem mesmo no disco (embora isso realmente seja do emulador de terminal): muito provavelmente, e pelo menos na maioria dos casos, em um segmento de memória alocado pelo emulador de terminal.

No entanto, com certeza, ele não está registrado em um arquivo, pelo menos não pelo shell, e eu não conheço os emuladores de terminal que registram a saída em um arquivo por padrão.

Na verdade, isso não significa que é impossível registrar a saída do terminal: primeiro vou mencionar algo que acho que muitos não sabem, já que nunca vi ninguém mencionando isso pelo menos aqui no Ask Ubuntu: Konsole permite salvar o arquivo. scrollback para um arquivo (talvez existam outros emuladores de terminal que ofereçam essa funcionalidade, o Konsole é apenas o único que conheço), embora isso seja limitado pelo limite de tamanho de scrollback do Konsole.

No entanto, isso geralmente não é realmente útil, e é mais provável que você queira procurar soluções "adequadas" para registrar a saída de uma sessão inteira em um arquivo ( como registrar todas as entradas e saídas em uma sessão de terminal? E a resposta de Ron ).

kos
fonte
1

Existe um comando nomeado como script, se não estiver instalado, o apt-get install scriptfaria.

Em seguida, no terminal, basta digitar script.

e faça o que quiser, depois de terminar, digite exit e, em seguida, haverá um arquivo criado no seu diretório atual com todas as informações stdout e stdin.

espero que ajude você.

rɑːdʒɑ
fonte
O pacote é NA no ubuntu 18.04
markroxor em 3/01
1

Isso não tem nada a ver com o seu shell ( bash), não é um recurso do emulador de terminal que você está usando. Ele é armazenado no "buffer de retorno de rolagem" do seu terminal. Não consegui encontrar explicações claras sobre onde exatamente isso está armazenado, mas a experiência pessoal me mostrou que ele está armazenado em algum lugar /tmp.

Como sugere a resposta da pergunta acima, ela provavelmente é armazenada em um arquivo sem nome. Para entender o que quero dizer, abra um novo arquivo com um editor de texto:

gedit newfile

Escreva uma linha de texto no arquivo e salve-o. Agora, enquanto esse arquivo ainda estiver aberto, abra um terminal e exclua-o:

rm newfile

Como você ainda tem o arquivo aberto gedit, você pode continuar gravando nele. Você pode até escrever vários gigabytes de dados nele, apesar de o arquivo ter sido excluído. Isso ocorre porque a exclusão de um arquivo simplesmente remove o link que aponta para o seu inode . Se seu descritor de arquivo for mantido aberto por outro programa, os dados poderão ser gravados nele, apesar do fato de que não há mais um link (arquivo) real correspondente ao descritor de arquivo no sistema de arquivos.

Tudo isso significa que o histórico do seu terminal provavelmente é salvo usando um truque como esse, em algum lugar de um arquivo excluído do Windows /tmp. O que você provavelmente quer é simplesmente aumentar o tamanho do buffer de rolagem do seu emulador de terminal, para que você possa simplesmente rolar para cima e vê-lo. Os detalhes de como fazer isso dependem do emulador de terminal que você está usando. A maioria tem uma opção de linha de comando que permite isso e muitos também têm uma maneira GUI de defini-la. Por exemplo, em gnome-terminal(o padrão no Ubuntu) é Editar -> Preferências -> Perfis --- clique no seu perfil -> Editar -> Rolagem -> Limitar a rolagem para NNN:

tela de opções do terminal gnome

Terdon
fonte
Introspecção interessante. Inspecionando uma história mais longa no terminal não é o que eu quero, porém: eu quero ter acesso ao cout ao terminal ou seja, tudo o que foi escrito há DE EG PYTHON
Daniel Böckenhoff
@ DanielBöckenhoff, então você provavelmente quer scriptcomo descrito na resposta aceita.
terdon
Certo. Eu aceitei :)
Daniel Böckenhoff
-2

A sessão do terminal é armazenada no .bash_historyarquivo Digite isso no seu terminal echo $HISTFILE, isso daria o caminho do .bash_historyarquivo.

user532036
fonte
2
Isso fornece apenas os comandos executados anteriormente , não a saída dos comandos.
Ron