posizione del file della cronologia di output della shell bash


13

Dove la shell bash memorizza la sessione terminale effettiva? Voglio leggere l'output dei comandi che ho usato prima. Tutto ciò che posso trovare su Google è come memorizzare l'output di un comando.

Poiché l'output viene visualizzato sullo schermo, deve comunque essere memorizzato da qualche parte. Quindi la mia domanda è: dove?

Risposte:


11

Bash memorizza solo la cronologia dei comandi eseguiti (che è possibile recuperare digitando history). A meno che tu non abbia già impostato lo scroll-back su un numero molto alto, non c'è modo di vedere gli output che sono più vecchi del valore impostato di scroll-back. Anche l'impostazione di questo valore su un numero molto alto renderà il tuo scorrimento lento poiché le linee sono memorizzate nella memoria .

Per memorizzare i tuoi comandi futuri e i loro output, ci sono alcune opzioni:

utilizzando screen

Avvia una sessione schermo inserendo screen. Una volta entrati nella schermata, premere Ctrl- a, quindi :, quindi accedere log. Tutto l'I / O verrà acquisito in screenlogfile nella directory in cui è stato avviato il screencomando.

utilizzando script

Puoi iniziare digitando script. Uno script di sessione avrà inizio che catturerà tutti gli I / O in un file denominato typescript. È possibile uscire dalla scriptsessione per Ctrl- d e visualizzare i registri nel typescriptfile.

utilizzando tee

tee è uno strumento utile. Puoi fare qualcosa del genere:

$ bash | tee log.txt

Questo aprirà una nuova shell bash all'interno di quella che stai già eseguendo. Quando exitesci da questo, puoi vedere gli output nel file chiamatolog.txt

Altri modi

Come suggerito da Dustin Kirkland in questo post, puoi anche usare byobu . Anche se non ho mai usato, anche strumenti per screencast terminali come Shelr sembrano un'opzione.


6

Ci sono molte domande relative a questo, ma iniziano tutte con il presupposto (giusto) che l'output non sia registrato.

Quindi la mia domanda è: dove?

Da nessuna parte: l'output di Bash (e qualsiasi altra shell che conosco) non viene registrato.

Poiché l'output viene visualizzato sullo schermo, deve comunque essere memorizzato da qualche parte.

Lo è, ma molto probabilmente non nel testo normale e nemmeno sul disco (anche se questo dipende davvero dall'emulatore di terminale): molto probabilmente, e almeno nella maggior parte dei casi, in un segmento di memoria allocato dall'emulatore di terminale.

Tuttavia, sicuramente non è registrato in un file, almeno non dalla shell, e non conosco gli emulatori di terminale che registrano l'output su un file per impostazione predefinita.

In effetti questo non significa che sia impossibile registrare l'output del terminale: per prima cosa menzionerò qualcosa di cui non molti sono a conoscenza, dal momento che non ho mai visto nessuno menzionarlo almeno qui su Ask Ubuntu: Konsole permette di salvare il scorrere verso un file (forse ci sono altri emulatori di terminale che forniscono tale funzionalità, Konsole è solo l'unico che conosco), sebbene questo sia limitato dal limite di dimensioni dello scrollback di Konsole.

Questo spesso non è molto utile, e molto probabilmente vorrai cercare soluzioni "appropriate" per registrare l'output di un'intera sessione in un file ( come posso registrare tutti gli input e output in una sessione terminale? E la risposta di Ron ).


1

C'è un comando chiamato come script, se non installato apt-get install scriptlo farebbe.

Quindi nel terminale basta digitare script.

e fai quello che vuoi, dopo aver finito basta digitare exit e poi ci sarà un file creato nella directory corrente con tutte le informazioni stdout e stdin.

spero che ti aiuti.


Il pacchetto è NA in Ubuntu 18.04
markroxor il

1

Questo non ha nulla a che fare con la shell ( bash), non è una funzione dell'emulatore di terminale che si sta utilizzando. È memorizzato nel "buffer di scorrimento" del terminale. Non sono stato in grado di trovare spiegazioni chiare su dove sia archiviato esattamente questo, ma l'esperienza personale mi ha mostrato che è memorizzato da qualche parte /tmp.

Come suggerisce la risposta alla domanda collegata sopra, molto probabilmente è memorizzata in un file senza nome. Per vedere cosa intendo, apri un nuovo file con un editor di testo:

gedit newfile

Scrivi una riga di testo nel file e salvalo. Ora, mentre quel file è ancora aperto, apri un terminale ed eliminalo:

rm newfile

Dato che il file è ancora aperto gedit, puoi continuare a scriverlo. È anche possibile scrivere diversi gigabyte di dati al suo interno, nonostante il file sia stato eliminato. Questo perché l'eliminazione di un file rimuove semplicemente il collegamento che punta al suo inode . Se il suo descrittore di file viene tenuto aperto da un altro programma, i dati possono essere scritti su di esso, sconsigliare il fatto che non vi sia più un collegamento (file) effettivo corrispondente al descrittore di file sul file system.

Tutto questo per dire che la cronologia del tuo terminale è probabilmente salvata usando un trucco del genere, da qualche parte in un file eliminato in /tmp. Quello che probabilmente vuoi effettivamente è semplicemente aumentare la dimensione del buffer di scrollback dell'emulatore di terminale in modo da poter semplicemente scorrere verso l'alto e vederlo. I dettagli su come eseguire questa operazione dipendono dall'emulatore di terminale che si sta utilizzando. La maggior parte ha un interruttore a riga di comando che ti consente di farlo e molti hanno anche un modo GUI di impostarlo. Ad esempio, in gnome-terminal(impostazione predefinita su Ubuntu) è Modifica -> Preferenze -> Profili --- fai clic sul tuo profilo -> Modifica -> Scorrimento -> Limita scorrimento su NNN:

schermata delle opzioni di gnome-terminal


Informazioni interessanti. Ispezionare una storia più lunga nel terminale non è quello che voglio però: voglio avere accesso al cout al terminale, ovvero tutto ciò che è stato scritto lì DA EG PYTHON
Daniel Böckenhoff,

@ DanielBöckenhoff allora probabilmente vuoi scriptcome descritto nella risposta accettata.
terdon,

Sicuro. L'ho accettato :)
Daniel Böckenhoff il

-2

La sessione terminale è memorizzata nel .bash_historyfile. Inserisci questo nel tuo terminale echo $HISTFILE, questo ti darebbe il percorso del .bash_historyfile.


2
Ciò fornisce solo i comandi precedentemente eseguiti , non l' output dei comandi.
Ron,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.