Bash domyślnie wyłącza historię w nieinteraktywnych powłokach, ale można ją włączyć.
#!/bin/bash
HISTFILE=~/.bash_history
set -o history
history | tail …
Ale jeśli próbujesz monitorować aktywność na tym serwerze, historia powłoki jest bezużyteczna (trywialne jest uruchamianie poleceń, które nie pojawiają się w historii). Zobacz Jak mogę zalogować wszystkie uruchomienia procesów w systemie Linux .
Jeśli debugujesz skrypt, historia powłoki nie jest najlepszym sposobem na uzyskanie użytecznych informacji. O wiele lepszym narzędziem jest narzędzie do śledzenia debugowania: umieszczone set -x
w górnej części skryptu. Śledzenie jest zapisywane jako błąd standardowy.
Gilles „SO- przestań być zły”
źródło
histtest.sh: 5: set: Illegal option -o history
sh
dash ocenia dokładnie na podstawie treści komunikatu o błędzie). Aby uzyskać dostęp do historii bash, musisz użyć bash (skrypt rozpoczynający się od#!/bin/bash
lub#!/usr/bin/env bash
).Illegal option
(powiedziałbyset: history: invalid option name
).set -o history
po historii, które zostaną wypełnione wpisami takimi jakif [...
vars=$(...
itp.set -x
jest to o wiele bardziej przydatne.Nie jestem pewien, czy faktycznie korzysta on z funkcji historii, gdy jest uruchamiany nieinteraktywnie, w przeciwnym razie każdy uruchamiany skrypt powłoki zaśmieciłby historię poleceń.
Dlaczego nie pójść bezpośrednio do źródła
${HOME}/.bash_history
, należy wymienićhistory | tail -100
ztail -100 ${HOME}/.bash_history
. (Jeśli używasz znaczników czasu, prawdopodobnie będziesz musiał zrobić coś w stylugrep -v ^# ${HOME}/.bash_history | tail -100
).źródło
greq -v '^#[0-9]\+$'
(czasami „history
i wyjściemgrep
metody ...history -a; history -c; history -r
. (dodaj, wyczyść, przeczytaj)Jeśli chcesz użyć danych wyjściowych
history
polecenia z aktywnej sesji powłoki w skrypcie, możesz użyć aliasu, aby najpierw uruchomić polecenie. Następnie, w tym samym aliasie, możesz wywołać pozostałą część skryptu. Dzięki takiej konfiguracji można osiągnąć zasadniczo ten sam wynik, cohistory
polecenie w skrypcie.Na przykład możesz utworzyć taki alias, zakładając, że nazwa skryptu to script.sh:
I zmień skrypt na następujący:
Znalazłem to pytanie, pisząc proces łączenia, sortowania i synchronizacji
~/bash_history
plików na dwóch komputerach, dzięki czemu łatwo będzie wyszukiwać polecenia, z których korzystałem w przeszłości.O wiele łatwiej jest zaktualizować mój plik historii zbiorczej bez konieczności logowania się do nowej powłoki w celu
~/bash_history
zaktualizowania. W przypadku monitorowania serwera to oczywiście nie zadziała, jak wspomniano w innych odpowiedziach.Moje użycie w szczególności to:
Skrypt
hby.sh
następnie pobiera wszystkie unikalne wpisy ze wszystkich~/.bash_history*
plików.źródło
Wydaje się, że wbudowana historia jest wyłączona w skrypcie powłoki. Zobacz tutaj: http://www.tldp.org/LDP/abs/html/histcommands.html
Nie znalazłem żadnej oficjalnej dokumentacji na ten temat.
źródło
Utwórz skrypt o nazwie
script.sh
jak poniżej. Tworzy skrypt o nazwie X i umieszcza w nim Y Liczba linii twojej historii.Następnie, jeśli chcesz utworzyć skrypt do wykonania zadania o nazwie „zadanie”, nad którym pracowałeś przez ostatnie 14 uruchomionych linii
Następnie posprzątaj swoją historię, aby stworzyć fajny skrypt!
źródło
histtest.sh: 5: set: Illegal option -o history
Polecenie historii jest domyślnie wyłączone w skrypcie bash, dlatego nawet polecenie historii nie będzie działać w pliku .sh. w celu przekierowania prosimy o przekierowanie pliku bash_history w pliku .sh.
lub mechanizm historii można włączyć również, wspominając plik historii i zmieniając parametry czasu działania, jak wspomniano poniżej
Uwaga: wspomniane powyżej dwa wiersze na górze pliku skryptu. teraz polecenie historii będzie działać w historii.
źródło
Każdy użytkownik ma swój własny plik historii, który jest wynikiem polecenia historii. Zamiast użycia polecenia historii w skrypcie powłoki, możesz użyć pliku historii dla użytkownika. W
.bash_history
katalogu domowym użytkownika będzie plik, który będzie plikiem historii użytkownika.źródło
Krótka odpowiedź :
służy
history -p
do jawnego wykonywania ekspansji historii.Oto przykład.
Jeden przypadek użycia często się dla mnie zdarza:
Od czasu mojej bash
set -o histexpand
zwykle piszę na maszynieaby edytować pliki wymienione za pomocą poprzedniego polecenia.
Niestety czasami zdarza się błąd, więc włączam weryfikację przez
shopt -s histverify
.Teraz mogę zweryfikować rozszerzenie przy koszcie jednego dodatkowego Returnklucza.
Dzisiaj chcę zawinąć te szczegóły w funkcję bash, ponieważ często ich używam,
Tutaj używam dwóch zagnieżdżonych
command substitution
, wewnętrznego do rozwinięcia!!
do poprzedniego polecenia, zewnętrznego do wykonania i uzyskania wyniku.Teraz mogę osiągnąć ten sam efekt, mając tylko trzy klucze, a jednym z nich jest Return!
źródło