Lokalizacja pliku wyjściowego historii powłoki powłoki bash

13

Gdzie powłoka bash przechowuje rzeczywistą sesję terminala? Chcę odczytać dane wyjściowe poleceń, których wcześniej użyłem. Wszystko, co mogę znaleźć w Google, to jak przechowywać dane wyjściowe polecenia.

Ponieważ dane wyjściowe są wyświetlane na ekranie, muszą być gdzieś przechowywane. Więc moje pytanie brzmi: gdzie?

Daniel Böckenhoff
źródło

Odpowiedzi:

11

Bash przechowuje tylko historię uruchomionych poleceń (które można pobrać, wpisując history). O ile nie ustawiłeś już przewijania wstecz na bardzo wysoką liczbę, nie ma sposobu, aby zobaczyć wyjścia, które są starsze niż ustawiona wartość przewijania. Również ustawienie tej wartości na bardzo wysoką liczbę spowoduje, że przewijanie będzie powolne, ponieważ linie są przechowywane w pamięci .

Aby przechowywać przyszłe polecenia i ich wyniki, istnieje kilka opcji:

Za pomocą screen

Rozpocznij sesję ekranu , wprowadzając screen. Po przejściu do ekranu naciśnij Ctrl- a, następnie :, a następnie wprowadź log. Wszystkie operacje we / wy zostaną przechwycone w screenlogplikach w katalogu, w którym uruchomiono screenpolecenie.

Za pomocą script

Możesz zacząć od pisania script. Skrypt sesja rozpocznie że będzie przechwytywać wszystkie wejścia / wyjścia do pliku o nazwie typescript. Możesz wyjść z scriptsesji przez Ctrl- d i przejrzeć dzienniki w typescriptpliku.

Za pomocą tee

tee to przydatne narzędzie. Możesz zrobić coś takiego:

$ bash | tee log.txt

Spowoduje to otwarcie nowej powłoki bash wewnątrz już uruchomionej. Po exitwyjściu z tego możesz zobaczyć wyniki w pliku o nazwielog.txt

Inaczej

Jak zasugerował Dustin Kirkland w tym poście, możesz także użyć byobu . Chociaż nigdy nie korzystałem, narzędzia do screencastingu terminali, takie jak Shelr, również brzmią jak opcja.

Ron
źródło
6

Jest wiele pytań związanych z tym, ale wszystkie zaczynają się od (właściwego) założenia, że ​​dane wyjściowe nie są rejestrowane.

Więc moje pytanie brzmi: gdzie?

Nigdzie: dane wyjściowe Basha (i innych znanych mi powłok) nie są rejestrowane.

Ponieważ dane wyjściowe są wyświetlane na ekranie, muszą być gdzieś przechowywane.

Jest, ale najprawdopodobniej nie w postaci zwykłego tekstu, a nawet nie na dysku (chociaż tak naprawdę zależy od emulatora terminala): najprawdopodobniej, a przynajmniej w większości przypadków, w segmencie pamięci przydzielonym przez emulator terminala.

Jednak na pewno nie jest on logowany do pliku, przynajmniej nie przez powłokę, i nie znam emulatorów terminali, które domyślnie logują dane wyjściowe do pliku.

Rzeczywiście nie oznacza to, że nie można zalogować wyjścia terminala: najpierw wspomnę o czymś, o czym myślę, że niewielu jest świadomych, ponieważ nigdy nie widziałem, żeby ktoś wspominał o tym przynajmniej tutaj na Ask Ubuntu: Konsola pozwala zapisać przewiń do pliku (być może istnieją inne emulatory terminali, które zapewniają taką funkcjonalność, Konsole jest jedynym, jaki znam), chociaż jest to ograniczone przez limit rozmiaru przewijania Konsoli.

Często nie jest to jednak bardzo przydatne i najprawdopodobniej będziesz chciał znaleźć „właściwe” rozwiązania do rejestrowania danych wyjściowych całej sesji w pliku ( Jak mogę zarejestrować wszystkie dane wejściowe i wyjściowe w sesji terminalowej? I odpowiedź Rona ).

kos
źródło
1

Istnieje polecenie o nazwie skryptu, jeśli nie zostanie zainstalowane apt-get install script, zrobi to.

Następnie w terminalu po prostu wpisz skrypt.

i rób co chcesz, po zakończeniu po prostu wpisz polecenie exit, a następnie w twoim bieżącym katalogu zostanie utworzony plik ze wszystkimi informacjami o standardowym wejściu i standardowym wejściu.

mam nadzieję, że ci to pomoże.

rɑːdʒɑ
źródło
Pakiet jest NA w Ubuntu 18.04
markroxor
1

Nie ma to nic wspólnego z twoją powłoką ( bash), nie jest funkcją emulatora terminala, którego używasz. Jest on przechowywany w „przewijanym buforze” terminala. Nie byłem w stanie znaleźć żadnego jasnego wyjaśnienia, gdzie dokładnie jest to przechowywane, ale osobiste doświadczenie pokazało mi, że jest gdzieś przechowywane /tmp.

Jak sugeruje odpowiedź na powyższe pytanie, najprawdopodobniej jest przechowywany w pliku bezimiennym. Aby zobaczyć, co mam na myśli, otwórz nowy plik za pomocą edytora tekstu:

gedit newfile

Napisz wiersz pliku do pliku i zapisz go. Teraz, gdy ten plik jest nadal otwarty, otwórz terminal i usuń go:

rm newfile

Ponieważ plik jest nadal otwarty gedit, możesz kontynuować zapisywanie w nim. Możesz nawet zapisać w niej kilka gigabajtów danych, mimo że plik został usunięty. Jest tak, ponieważ usunięcie pliku po prostu usuwa link wskazujący jego i- węzeł . Jeśli jego deskryptor pliku jest utrzymywany przez inny program, można do niego zapisać dane, co świadczy o tym, że w systemie plików nie ma już rzeczywistego łącza (pliku) odpowiadającego deskryptorowi pliku.

Wszystko to oznacza, że ​​historia twojego terminala jest prawdopodobnie zapisywana za pomocą takiej sztuczki, gdzieś w usuniętym pliku w /tmp. To, czego prawdopodobnie naprawdę chcesz, to po prostu zwiększyć rozmiar bufora przewijania w emulatorze terminali, abyś mógł przewinąć w górę i zobaczyć go. Szczegóły tego, jak to zrobić, zależą od używanego emulatora terminala. Większość z nich ma przełącznik wiersza poleceń, który pozwala ci to zrobić, a wielu ma również GUI sposób ustawienia. Na przykład w gnome-terminal(domyślnym w Ubuntu) jest Edycja -> Preferencje -> Profile --- kliknij swój profil -> Edytuj -> Przewijanie -> Ogranicz przewijanie do NNN:

ekran opcji gnome-terminal

terdon
źródło
Ciekawy wgląd. Sprawdzanie dłuższej historii w terminalu nie jest jednak tym, czego chcę: chcę mieć dostęp do cout do terminala, tj. Wszystko, co tam napisano Z EG PYTHON
Daniel Böckenhoff,
@ DanielBöckenhoff, to prawdopodobnie chcesz, scriptjak opisano w zaakceptowanej odpowiedzi.
terdon
Pewnie. Zaakceptowałem to :)
Daniel Böckenhoff,
-2

Sesja terminalowa jest przechowywana w .bash_historypliku. Wpisz to w swoim terminalu echo $HISTFILE, to da ci ścieżkę do .bash_historypliku.

użytkownik532036
źródło
2
Daje to tylko poprzednio uruchomione polecenia , a nie ich wynik .
Ron