„Historia” przestaje działać po uruchomieniu w skrypcie bash


9

Piszę prosty skrypt, aby przeglądać moją historię bashów w celu znalezienia określonego ciągu. W wierszu polecenia mogę wykonać następujące czynności, które działają dobrze:

history | grep git

Jednak gdy tworzę skrypt bashowy za pomocą tego samego polecenia co powyżej, nagle historynic nie zwraca:

#!/bin/bash
history | grep git

Kiedy usuwam pierwszy wiersz #!/bin/bash, mój skrypt działa ponownie. Co tu się dzieje? Jak mogę używać historyw skrypcie bash?

Odpowiedzi:


8

Poniżej podano bash 4.0 or higher only, ale załatwia sprawę. :)

#!/bin/bash -i
history | grep sometext

Pracuje! Wypróbuj to. ( -i= Ja nteractive, flaga nie dostępne do bash 3.x i wcześniej)


Dziękuję również kolesiu, który ostatnio przegłosował mnie tylko dlatego, że może. (Prawdopodobnie bashużytkownik v3, z samej frustracji, haha). Przynajmniej dla Martina moje rozwiązanie było bardzo pomocne, to (przynajmniej) komfort.
— składniaerror

Miałem to samo pytanie, kiedy pisałem narzędzie, które rejestruje pracę po godzinach pracy dla inżynierów wsparcia 24/7 .. dzięki!
— Henry van Megen

14

Po uruchomieniu skryptu powłoki bash, na przykład poprzez uruchomienie pliku wykonywalnego, którego linia shebang jest #!/bin/bash, skrypt jest uruchamiany w nieinteraktywnej powłoce. Jedną z cech nieinteraktywnej powłoki jest wyłączenie historii. Jeśli więc chcesz, aby skrypt mógł korzystać z historii, musisz zrobić coś takiego:

#!/bin/bash
HISTFILE=~/.bash_history   # Or wherever you bash history file lives
set -o history             # enable history
history | grep git

Oczywiście w tym przypadku mógłbyś właśnie zrobić:

grep git ~/.bash_history

Ponieważ oba powyższe wymagają, aby plik historii ( ~/.bash_history) był aktualny, co prawie na pewno nie będzie.

Nie jestem pewien, jak uruchamiasz skrypt po usunięciu linii shebang. Pozyskanie pliku (np. Z .) nie jest tym samym, co uruchomienie skryptu, ponieważ polecenia działają w bieżącej powłoce, która ma włączoną historię.


Co powiesz na wykonanie history -azaraz po poleceniu set, aby upewnić się, że ostatnie polecenia są najpierw dołączane do pliku?

4
@ illuminÉ: nie pomoże. Powłoka zaczęła uruchamiać skrypt jest procesem całkowicie trudnym; zaczyna się od pustej historii frsh.
— rici
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.